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

Какие различия между r и rb в fopen

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

XNU

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

Linux

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