в чем разница между r и rb в fopen


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

5 51

5 ответов:

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

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

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

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

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

наконец, увидеть в чем разница между текстовым и двоичным вводом/выводом? on comp.ленг.C часто задаваемые вопросы.

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

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

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

XNU

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

Linux

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