Does fwrite flush the buffer on '\n'?
Asked Answered
A

1

7

I have my own implementation of _open(), _close(), _write(), _read().

My code:

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 is 1024

Compiler: arm-none-eabi-gcc/ Version: 5.4.1

Why does fwrite() interpret '\n' even though I have the flags "wb"?

Does fopen() interpret the filename "0:test"?

Accusation answered 22/2, 2018 at 12:26 Comment(1)
it depends on the buffering mode - see setvbuf() and friends...Waiver
P
5

Why does fwrite() interpret '\n' even though I have the flags "wb"?

Because the stream is line buffered. Whether a stream would become line buffered or not is not determined by the flags passed to fopen().

The toolchain you are using ships with Red Hat's newlib, which calls the isatty() function at the first attempt to read from or write to the stream. If isatty() returns a nonzero value, then the stream will be line buffered.

If you don't like it, you can modify _isatty() to return 0, or call setvbuf() after fopen().

Does fopen() interpret the filename "0:test"?

No, any filename will be passed on directly to _open().

Philippines answered 22/2, 2018 at 14:35 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.