Подтвердить что ты не робот

Разница между файлами, записанными в двоичном и текстовом режимах

Что происходит при записи в файл, который был открыт в текстовом режиме, который не встречается в двоичном режиме? В частности, в MS Visual C.

unsigned char buffer[256];
for (int i = 0; i < 256; i++) buffer[i]=i;
int size  = 1;
int count = 256;

Двоичный режим:

FILE *fp_binary = fopen(filename, "wb");
fwrite(buffer, size, count, fp_binary);

В текстовом режиме:

FILE *fp_text = fopen(filename, "wt");
fwrite(buffer, size, count, fp_text);
4b9b3361

Ответ 1

Я считаю, что большинство платформ будут игнорировать параметр "t" или "текстовый режим" при работе с потоками. Однако в окнах это не так. Если вы посмотрите на описание функции fopen() по адресу: MSDN, вы увидите, что указание опции "t" будет имеют следующий эффект:

  • line feeds ('\n') будет переведен в последовательности "\ r\n" на выходе
  • последовательности возврата каретки/последовательности строк будут переведены на линейные каналы на входе.
  • Если файл открывается в режиме добавления, конец файла будет проверяться на символ ctrl-z (символ 26), и этот символ будет удален, если это возможно. Он также будет интерпретировать присутствие этого символа как конец файла. Это неудачный перерыв с дней CPM (что-то о грехах родителей, посещаемых их детьми до 3-го или 4-го поколения). Вопреки ранее высказанному мнению, символ ctrl-z не будет добавлен.

Ответ 2

В текстовом режиме новая строка "\n" может быть преобразована в возврат каретки + новая строка "\ r\n"

Обычно вы хотите открыть в двоичном режиме. Попытка прочитать любые двоичные данные в текстовом режиме не будет работать, она будет повреждена. Вы можете читать текст ok в двоичном режиме, хотя это просто не будет делать автоматические переводы "\n" на "\ r\n".

См. fopen

Ответ 3

Кроме того, когда вы открываете файл с "rt", вход заканчивается символом Crtl-Z.

Ответ 4

Другое отличие заключается в использовании fseek

Если поток открыт в двоичном режиме, новая позиция представляет собой точно смещенные байты, измеренные от начала файла, если исходное значение - SEEK_SET, из текущей позиции файла, если origin - SEEK_CUR, и из конца файла, если источник SEEK_END. Некоторые двоичные потоки могут не поддерживать SEEK_END.

Если поток открыт в текстовом режиме, единственные поддерживаемые значения для смещения равны нулю (который работает с любым источником) и значением, возвращаемым более ранним вызовом std:: ftell в потоке, связанном с тем же файлом (который работает только с началом SEEK_SET.

Ответ 5

У нас возникла интересная проблема с открытием файлов в текстовом режиме, где в файлах была смесь символов окончания строки:

1\n\r
2\n\r
3\n
4\n\r
5\n\r

Наше требование состоит в том, что мы можем сохранить текущую позицию в файле (мы использовали fgetpos), закройте файл, а затем позже, чтобы открыть файл и искать его (мы использовали fsetpos).

Однако, когда в файле есть смеси окончаний строки, этот процесс не смог найти фактическое положение. В нашем случае (наш инструмент анализирует С++) мы перечитывали часть файла, который мы уже видели.

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