Я не понимаю пример fmemopen
из APUE
#include <stdio.h>
#include <string.h>
#define BSZ 48
int
main()
{
FILE *fp;
char buf[BSZ];
memset(buf, 'a', BSZ-2);
buf[BSZ-2] = '\0';
buf[BSZ-1] = 'X';
if ((fp = fmemopen(buf, BSZ, "w+")) == NULL) //"w+" truncate the file by setting the first byte to null byte
printf("fmemopen failed\n");
printf("initial buffer contents: %s\n", buf); //print nothing cause the first byte is null byte.
fprintf(fp, "hello, world"); //write format string to the stream, so the buffer should change and be rewritten.
printf("before flush: %s\n", buf); //should print "hello, world". Why not?
fflush(fp);
printf("after fflush: %s\n", buf);
printf("len of string in buf = %ld\n", (long)strlen(buf));
memset(buf, 'b', BSZ-2);
buf[BSZ-2] = '\0';
buf[BSZ-1] = 'X';
fprintf(fp, "hello, world");
fseek(fp, 0, SEEK_SET);
printf("after fseek: %s\n", buf);
printf("len of string in buf = %ld\n", (long)strlen(buf));
memset(buf, 'c', BSZ-2);
buf[BSZ-2] = '\0';
buf[BSZ-1] = 'X';
fprintf(fp, "hello, world");
fclose(fp);
printf("after fclose: %s\n", buf);
printf("len of string in buf = %ld\n", (long)strlen(buf));
return(0);
}
Я использую Clion для отладки, и когда он завершает fprintf(fp, "hello, world");
и достигает printf("before flush: %s\n", buf);
, я вижу содержимое массива char buf
не меняется и ничего не печатает . Почему!?
Отладочный скриншот для лучшего описания:
Также, цитата из книги:
В-третьих, нулевой байт записывается в текущей позиции в потоке всякий раз, когда мы
увеличьте объем данных в буфере потока и вызовите fclose
, fflush
, fseek
,
fseeko
или fsetpos
.
Что это значит?
Обновление:
Из книги кажется, что буфер не изменяется до тех пор, пока поток не будет сброшен - ожидаемый результат.