代码之家  ›  专栏  ›  技术社区  ›  Cosinus

fwrite是否刷新“\n”上的缓冲区?

  •  7
  • Cosinus  · 技术社区  · 6 年前

    我有自己的实现 _open() , _close() , _write() , _read() .

    我的代码:

    FILE *f = fopen("0:test", "wb");  // calls _open()
    fwrite("hello ", 6, 1, f);
    fwrite("world\r\n\0", 8, 1, f); // calls _write(3, "hello world\r\n", 13)
    fflush(f);                      // calls _write(3, "\0", 1)
    fclose(f);                      // calls _close(3)
    

    BUFSIZE 为1024

    编译器: arm-none-eabi-gcc /版本: 5.4.1

    为什么 fwrite() 解释 '\n' 即使我有国旗 "wb" ?

    fopen() 解释文件名 "0:test" ?

    1 回复  |  直到 6 年前
        1
  •  4
  •   followed Monica to Codidact    6 年前

    为什么 fwrite() 解释 '\n' 即使我有国旗 "wb" ?

    因为流是行缓冲的。流是否会变为行缓冲不是由传递给的标志决定的 fopen() .

    您使用的工具链带有Red Hat的newlib,它调用 isatty() 函数在首次尝试读取或写入流时执行。如果 isatty() 返回一个非零值,则流将被行缓冲。

    如果不喜欢,可以修改 _isatty() 返回 0 ,或致电 setvbuf() 之后 fopen() .

    fopen() 解释文件名 "0:test" ?

    否,任何文件名都将直接传递给 _open() .