Использование fmemopen - PullRequest
       2

Использование fmemopen

1 голос
/ 07 марта 2019

Я не понимаю пример 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 не меняется и ничего не печатает . Почему!?

Отладочный скриншот для лучшего описания:

enter image description here

Также, цитата из книги:

В-третьих, нулевой байт записывается в текущей позиции в потоке всякий раз, когда мы увеличьте объем данных в буфере потока и вызовите fclose, fflush, fseek, fseeko или fsetpos.

Что это значит?


Обновление:

Из книги кажется, что буфер не изменяется до тех пор, пока поток не будет сброшен - ожидаемый результат.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...