Почему я должен сбросить свой поток ввода-вывода для получения корректного результата?

Почему код ниже не работает? Я имею в виду, это показывает все виды странных символов на консольном выводе.

#include <stdio.h>
char mybuffer[80];
int main()
{
    FILE * pFile;
    pFile = fopen ("example.txt","r+");
    if (pFile == NULL) perror ("Error opening file");

    else {
        fputs ("test",pFile);

        fgets (mybuffer,80,pFile);
        puts (mybuffer);
        fclose (pFile);
        return 0;
    }
}

Однако код ниже работ хорошо.

#include <stdio.h>
char mybuffer[80];
int main()
{
    FILE * pFile;
    pFile = fopen ("example.txt","r+");
    if (pFile == NULL) perror ("Error opening file");

    else {
        fputs ("test",pFile);
        fflush (pFile);    
        fgets (mybuffer,80,pFile);
        puts (mybuffer);
        fclose (pFile);
        return 0;
    }
}

Почему я должен сбросить поток для получения корректного результата?

10
задан Stephen 23 August 2011 в 15:59
поделиться

3 ответа

Потому что стандарт говорит об этом (§7.19.5.3/5):

Когда файл открывается в режиме обновления ('+' в качестве второго или третьего символа в приведенном выше списке аргументов режима значения), как ввод, так и вывод могут быть и ввод, и вывод могут выполняться на ассоциированном потоке. Однако вывод не должен непосредственно не должен непосредственно следовать за вводом без без промежуточного вызова функции fflush или функции позиционирования файла (fseek, fsetpos или перемотка), и ввод не должен непосредственно не должен следовать непосредственно за выводом без за вводом не должен непосредственно следовать вывод без промежуточного вызова функции позиционирования файла если только операция ввода не не встречает конец файла.

Для этого есть причина: вывод и ввод обычно буферизуются отдельно. Когда выполняется операция flush или seek, она синхронизирует буферы с файлом, но в противном случае она может позволить им рассинхронизироваться. Это в целом повышает производительность (например, когда вы выполняете чтение, не нужно проверять, была ли позиция, с которой вы читаете, записана с тех пор, как данные были считаны в буфер).

12
ответ дан 3 December 2019 в 18:33
поделиться

Можно использовать xpath, например «//AssetType [longname = 'characters' ]/xyz ».

Для XPath libs в Python см. http://www.somebits.com/weblog/tech/python/xpath.html

-121--4667597-

Группирование выполняется автоматически по Замку из песка, справа, но если вы хотите дать группе перегрузки общее описание, используйте для этого < overloads > тэга (в том же пути, что и < summary >). Это не стандартная XML-документация тэга но AFAIR она поддерживается Замок из песка Help File Builder.

-121--4483040-

При использовании файла в режиме чтения/записи необходимо вызвать fseek/fflush перед различными операциями ввода/вывода.

Смотрите этот ответ на , почему fseek или fflush всегда требуется...

7
ответ дан 3 December 2019 в 18:33
поделиться

это потому, что C file io работает с использованием буфера. Он записывается на диск только тогда, когда вы промываете его, пишете символ /n или заполняете буфер.

Поэтому в первом случае ваш файл ничего не содержит, когда вы читаете из него.

2
ответ дан 3 December 2019 в 18:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: