C стандартный библиотечный уголок - PullRequest
1 голос
/ 08 июля 2010

Является ли следующая программа допустимой C-программой?

#include <stdio.h>

int main()
{
    fwrite("x", 1, 1, stderr);
    fflush(stderr);
    fgetc(stderr);
    fwrite("y", 1, 1, stderr);
    return 0;
}

Обратите внимание, что я пытаюсь читать из stderr.

Когда я компилирую ее в Visual C ++ 2008 и запускаю ее, яполучить следующий вывод:

xy

, что имеет смысл.Однако, когда я перенаправляю stderr в файл (test.exe 2> foo.txt), я получаю окно «Ошибка отладки подтверждения» с сообщением: «Несогласованный счетчик потоков. Промежуток между последовательным чтением и записью».Добавление fflush между чтением и записью решает проблему.(Это происходит в отладочной сборке. В сборках выпуска вторая запись молча завершается сбоем).

Правильно ли это поведение или это ошибка библиотеки compiler ?Я нигде не смог найти никаких правил, описывающих, когда чтение или запись являются недопустимыми в C.

1 Ответ

3 голосов
/ 08 июля 2010

C99 говорит в 7.19.5.3 (fopen), параграф 6:

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

Поздравляем с открытием этого углового случая на практике. Реализация библиотеки полностью корректна, так как вы нарушаете * , приведенный выше.

И, кстати, нередко читать из stderr. Это полезно, когда stdin и stdout перенаправлены и нет доступных терминалов. Хотя C99 не гарантирует, что он будет читабельным, я помню некоторые случаи на POSIX-подобных системах, где это было фактически сделано.

...