Требуют ли `fprintf ()` и `fscanf ()` в Windows открытия файла в текстовом режиме? - PullRequest
0 голосов
/ 28 мая 2019

При использовании fprintf() и fscanf() для текстовых файлов в Windows, необходимо или рекомендуется открывать файл в текстовом режиме по сравнению с двоичным режимом?

Зависит ли ответ от использования Microsoft реализации стандартной библиотеки C или GNU Libc в Windows?

Ответы [ 2 ]

3 голосов
/ 28 мая 2019

В окнах двоичный или текстовый режим отличаются в конце преобразования строки.

Система выполняет преобразование конца строки (например, через POSIX write и read низкого уровня). Но это не имеет значения: преобразование конца строки выполняется в текстовом режиме, а в двоичном режиме ничего не меняется.

printf и другие функции форматирования заканчивают тем, что вызывают низкоуровневую функцию чтения / записи / любой другой функции, которая обрабатывает это преобразование конца строки.

  • Когда вы пишете символ новой строки \n в файле, открытом в текстовом режиме, система добавляет символ \r перед новой строкой.
  • Когда вы читаете \n в файле, открытом в текстовом режиме, система удаляет символ \r перед новой строкой. Если нет, то ничего не удаляется. Если есть 2 \r символов, он удаляет только один.

Обратите внимание, что написание текстовых файлов в двоичном режиме может быть полезно, если вы хотите писать совместимые с Linux текстовые файлы без символа \r.

2 голосов
/ 28 мая 2019

При использовании fprintf () и fscanf () для текстовых файлов в Windows, необходимо или рекомендуется открывать файл в текстовом режиме по сравнению с двоичным режимом?

fprintf / fscanf основаны на низкоуровневой функции fputc / fgetc и т. д., поэтому управление режимом text / binary следует тем же правилам, которые мы видим в Требует ли fgetc, fputc, fgets и fputs файл, открытый в текстовом режиме, а fread и fwrite - файл в двоичном режиме?

Зависит ли ответ от использования Microsoft реализации стандартной библиотеки C или GNU Libc в Windows?

Библиотека libc mingw поддерживается моей библиотекой Microsoft, ее поведение аналогично Microsoft libc, некоторые функции следуют ISO, но не GNU / gcc, который является реализацией, а нестандарт.Обратите внимание, что в целом Microsoft не полностью соответствует какому-либо конкретному стандарту POSIX (см. Совместимость в Microsoft Docs )

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