В чем разница между r и rb в fopen
Я пытался использовать fopen в C, второй параметр - режим открытия. Два режима "r" и "rb" меня сильно смущают. Кажется, они одинаковы. Но иногда лучше использовать "рб". Итак, почему существует "г"? Объясни мне это подробно или с примерами. Благодарю вас.
5 ответов
Вы должны использовать "r"
для открытия текстовых файлов. Разные операционные системы имеют немного разные способы хранения текста, и это будет выполнять правильные переводы, так что вам не нужно знать об особенностях локальной операционной системы. Например, вы будете знать, что переводы строк всегда будут выглядеть как простые "\n"
независимо от того, где выполняется код.
Вы должны использовать "rb"
если вы открываете нетекстовые файлы, потому что в этом случае переводы не подходят.
В Linux и Unix в целом, "r"
а также "rb"
подобные. Более конкретно, FILE
указатель, полученный fopen()
Использование файла в текстовом режиме и в двоичном режиме ведет себя одинаково на Unix. В окнах и в целом в системах, в которых для представления " новых строк" используется более одного символа, файл, открытый в текстовом режиме, ведет себя так, как если бы все эти символы были только одним символом, '\n'
,
Если вы хотите переносить чтение / запись текстовых файлов в любой системе, используйте "r"
, а также "w"
в fopen()
, Это гарантирует, что файлы записаны и прочитаны правильно. Если вы открываете бинарный файл, используйте "rb"
а также "wb"
, так что неудачный перевод новой строки не испортит ваши данные.
Обратите внимание, что следствием того, что базовая система выполняет перевод новой строки для вас, является то, что вы не можете определить количество байтов, которые вы можете прочитать из файла, используя fseek (file, 0, SEEK_END).
Наконец, посмотрите, в чем разница между текстовым и двоичным вводом / выводом? на comp.lang.c часто задаваемые вопросы.
Используйте "rb", чтобы открыть двоичный файл. Тогда байты файла не будут кодироваться, когда вы их читаете
- "r" - это то же самое, что и "rt" для переведенного режима
- "rb" - нетранслируемый режим.
Это имеет значение для Windows, по крайней мере. Смотрите эту ссылку для деталей.
В большинстве систем POSIX это игнорируется. Но, проверьте свою систему, чтобы быть уверенным.
XNU
Строка режима также может включать букву "b" либо как последний символ, либо как символ между символами в любой из двухсимвольных строк, описанных выше. Это строго для совместимости с ISO/IEC 9899:1990 ("ISO C90") и не имеет никакого эффекта; "б" игнорируется.
Linux
Строка режима может также включать букву "b" либо в качестве последнего символа, либо в качестве символа между символами в любой из двухсимвольных строк, описанных выше. Это строго для совместимости с C89 и не имеет никакого эффекта; 'b' игнорируется во всех системах, соответствующих POSIX, включая Linux. (Другие системы могут по-разному обрабатывать текстовые и двоичные файлы, и добавление "b" может быть хорошей идеей, если вы выполняете ввод-вывод в двоичном файле и ожидаете, что ваша программа может быть перенесена в не-UNIX-среды.)