Тип '1'
- int
в C, а не char
, поэтому вы читаете SIZE*sizeof(int)
байтов в каждом fread
. Если sizeof(int)
больше 1 (на большинстве современных компьютеров это так), то вы читаете мимо хранилища для buffer
. Это одно из мест, где C и C ++ различны: в C символьные литералы имеют тип int
, в C ++ они имеют тип char
.
Итак, вам нужно chars_read = fread(buffer, 1, SIZE, stdin);
, потому что sizeof(char)
равно 1 по определению.
На самом деле, я бы написал ваш цикл так:
while ((chars_read = fread(buffer, 1, sizeof buffer - 1)) > 0) {
buffer[chars_read] = 0; /* In case chars_read != sizeof buffer - 1.
You may want to do other things in this case,
such as check for errors using ferror. */
printf("%d, %s\n", chars_read, buffer);
}
Чтобы ответить на ваш другой вопрос, '\0'
- это int
0, поэтому {'\0'}
и {0}
эквивалентны.
Для setvbuf
моя документация гласит:
Аргумент size
может быть задан как ноль, чтобы получить отложенное выделение оптимального размера буфера как обычно.
Почему вы комментируете \\
вместо //
или /* */
? : -)
Редактировать : Исходя из вашего редактирования вопроса, sizeof("1")
неверно, sizeof(char)
правильно.
sizeof("1")
равно 2, потому что "1"
- это массив char
, содержащий два элемента: '1'
и 0
.