【问题标题】:Alternate between fwrite and fprintf on same file在同一文件上交替使用 fwrite 和 fprintf
【发布时间】:2014-10-26 02:47:36
【问题描述】:

是否可以在同一文件上交替写入二进制和常规写入?

我只需要像这样继续打开和关闭文件吗?

struct node x;
FILE* fout;
fout = fopen("output.bin", "wb");
fwrite(&x, sizeof(struct node), 1, fout);
fclose(fout);
fout = fopen("output.bin", "a");
fprintf("&d", x.data);

【问题讨论】:

    标签: c file-io bin


    【解决方案1】:

    就 POSIX 系统上的混合而言:这两者都是同一个库中的缓冲 stdio 例程,而在 POSIX (UNIX/Linux/Solaris/BSD) 操作系统上,二进制和文本模式之间没有区别,所以你确实可以混合它们。

    通常 fprintf 会在每个换行符之后触发刷新,只要您不将 fprintf/fwrite 与直接 write() 混合使用就可以了。

    关于Windows:fopen支持“b”模式,确实有区别。如果文件以文本模式打开,fseek 将被限制为开始或当前文件指针。我不假装知道在二进制模式下使用 fprintf() 是否会有任何陷阱,所以如果您关心 Windows,我建议您检查以前的 SO 线程。

    Difference between files writen in binary and text mode

    通常,如果我需要将格式化输出与二进制文件混合,我会先使用 sprintf() 或其他内存机制写入缓冲区,然后使用 fwrite() 批量写入(刷新)缓冲数据。

    【讨论】:

    • 太棒了,这正是我需要知道的。谢谢!
    • 还有特定于 Windows 的 _setmode 函数。这将允许您在二进制和文本 I/O 之间切换。
    • 我怀疑fprintffwrite 之间的缓冲存在差异,我认为这与应用这些函数的流有关。
    猜你喜欢
    • 1970-01-01
    • 2012-05-22
    • 2011-09-27
    • 2014-07-02
    • 2018-02-27
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多