Разница между файлами, записанными в двоичном и текстовом режиме - PullRequest
52 голосов
/ 23 октября 2008

Какой перевод происходит при записи в файл, который был открыт в текстовом режиме, а не в двоичном режиме? В частности, в 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);

Ответы [ 5 ]

42 голосов
/ 23 октября 2008

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

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

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

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

См. fopen

5 голосов
/ 23 октября 2008

Кроме того, когда вы открываете файл с помощью «rt», ввод заканчивается на символе Crtl-Z.

4 голосов
/ 17 июля 2014

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

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

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

3 голосов
/ 23 октября 2008

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

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

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

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

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

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