【问题标题】:how to write non-char* by using write() function?如何使用 write() 函数编写非字符 *?
【发布时间】:2012-09-04 00:27:59
【问题描述】:

可以使用write() 函数编写非字符* 吗?我需要打印unsigned long,但我不知道该怎么做。也就是说,在buf 参数中传递一个unsigned long

【问题讨论】:

    标签: c linux posix system-calls


    【解决方案1】:

    通常最好使用可用的标准 C 函数,因为它们更便于移植。如果可以,并且您想将其输出为文本,您应该查看fprintf 而不是fwrite。前者为你格式化,后者用于写入原始内存块。

    例如:

    int val = 42;
    fprintf (fh, "%d", val); // should check return value.
    

    将输出文本“42”。

    如果您确实想写出二进制表示,fwrite 就是这样做的方法:

    int val = 42;
    fwrite (&val, sizeof (val), 1, fh); // should check return value.
    

    这将写出二进制表示,以便将字节 00042 写入文件(当然取决于 int 变量的内存布局- 它可能因实施而异)。


    前提是您能够使用文件句柄而不是描述符,否则f* 函数对您不利。您希望使用较低级别的工作可能有正当理由。

    因此,如果您只有write 的描述符,则需要先将变量格式化为字符串,例如:

    char buff[100];
    sprintf (buff, "%d", val);
    write (fd, buff, strlen (buff)); // should check return value.
    

    假设您希望它作为文本。如果你想要它作为一个二进制值,它类似于我们在上面使用fwrite 完成它的方式:

    write (fd, &val, sizeof (val)); // should check return value.
    

    【讨论】:

    • 您能否解释一下为什么write(fd, (char *)&val, sizeof(int)); 不会产生预期的结果?和上面的fwrite一样,它不会也写二进制表示吗?
    • @HonkyTonk,它输出二进制表示。如果你有一个文件描述符而不是一个句柄,我添加了底部部分,所以我觉得不需要复制文本/二进制选项,但你仍然可以很容易地以文本或二进制输出。我会更新答案。
    猜你喜欢
    • 2016-05-01
    • 2020-02-04
    • 2013-11-09
    • 2010-10-14
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多