в чем разница между r и rb в fopen - PullRequest
52 голосов
/ 01 февраля 2010

Я пытался использовать fopen в C, второй параметр - режим открытия. Два режима «r» и «rb» меня сильно смущают. Кажется, они одинаковы. Но иногда лучше использовать «рб». Итак, почему существует «г»? Объясни мне это подробно или с примерами. Благодарю вас.

Ответы [ 5 ]

66 голосов
/ 01 февраля 2010

Вы должны использовать "r" для открытия текстовых файлов. Различные операционные системы имеют несколько разные способы хранения текста, и это будет выполнять правильные переводы, так что вам не нужно знать об особенностях локальной операционной системы. Например, вы будете знать, что переводы строк всегда будут отображаться как простые "\n", независимо от того, где выполняется код.

Вам следует использовать "rb", если вы открываете нетекстовые файлы, потому что в этом случае переводы не подходят.

28 голосов
/ 01 февраля 2010

В Linux и Unix в целом "r" и "rb" одинаковы. В частности, указатель FILE, полученный путем fopen() файла в текстовом режиме и в двоичном режиме, ведет себя одинаково в Unixes. В окнах и в целом в системах, которые используют более одного символа для представления « новых строк », файл, открытый в текстовом режиме, ведет себя так, как если бы все эти символы были только одним символом, '\n'.

Если вы хотите переносить чтение / запись текстовых файлов в любой системе, используйте "r" и "w" в fopen(). Это гарантирует, что файлы записаны и прочитаны правильно. Если вы открываете бинарный файл, используйте "rb" и "wb", чтобы неудачный перевод новой строки не испортил ваши данные.

Обратите внимание, что следствием того, что базовая система выполняет перевод новой строки для вас, является то, что вы не можете определить количество байтов, которые вы можете прочитать из файла, используя fseek (file, 0, SEEK_END) .

Наконец, см. В чем разница между текстовым и двоичным вводом / выводом? в comp.lang.c Часто задаваемые вопросы .

8 голосов
/ 01 февраля 2010

используйте «rb», чтобы открыть двоичный файл. Тогда байты файла не будут закодированы, когда вы их прочитаете

7 голосов
/ 01 февраля 2010

Это имеет значение для Windows, по крайней мере. Смотрите эту ссылку для деталей.

2 голосов
/ 12 января 2017

В большинстве систем POSIX это игнорируется. Но проверьте свою систему, чтобы быть уверенным.

XNU

Строка режима также может содержать букву «b» либо как последний символ, либо как символ между символами в любой из двухсимвольных строк, описанных выше. Это строго для совместимости с ISO / IEC 9899: 1990 («ISO C90») и не имеет никакого эффекта; 'b' игнорируется.

Linux

Строка режима может также включать букву 'b' как последнюю символ или как символ между символами в любом из двух символьные строки, описанные выше. Это строго для совместимость с С89 и не имеет никакого эффекта; «б» игнорируется на всех Системы, соответствующие POSIX, включая Linux. (Другие системы могут лечить текстовые файлы и двоичные файлы по-разному, и добавление «b» может быть хорошая идея, если вы делаете ввод / вывод в двоичный файл и ожидаете, что ваша программа может быть перенесен в не-UNIX среды.)

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