При использовании системного уровня ввода-вывода в Linux я заметил, что компилятор распознал флаги O_RDONLY
и O_RDWR
, но он не имел никакого представления о значении флагов O_BINARY
и O_TEXT
.
Это дело Linux?
Linux, и почти каждый вкус Unix, если неважно, не различает двоичные и текстовые файлы. Таким образом, нет стандартных констант с этим именем. Вы можете вручную определить константы в ноль в Linux, если вы хотите включить их в свой код для удобства переноски.
http://unix.derkeiler.com/Newsgroups/comp.unix.programmer/2007-03/msg00147.html
На уровне языка C и его стандартной библиотеки нет таких флагов, как O_BINARY
и O_TEXT
. Бинарный или текстовый режим выбирается путем добавления спецификатора b
параметра режима функции fopen
. Сам спецификатор, конечно же, поддерживается всеми реализациями C, но на платформах POSIX этот спецификатор не имеет никакого эффекта: по спецификации POSIX текстовый режим такой же, как в двоичном режиме.
Не удивительно, если вы углубитесь в уровень нестандартных функций Unix I / O для конкретной платформы, вы обнаружите, что они не знают об этом различии текста и двоичного кода.
Это вещь * nix. * Операционные системы nix не выполняют автоматическое преобразование строк для ввода-вывода в текстовых файлах, поэтому флаги O_TEXT и O_BINARY не имеют смысла.
На уровне ОС между двоичным и текстовым файлом в Unix нет разницы. Текстовый файл имеет ограниченный контент. Это также верно для Windows, но соглашения, используемые C для конца строк, такие же, как и для Unix, в то время как Windows использует пару CR / LF (и явный конец маркера файла в некоторых контекстах, но обработка это было непротиворечиво даже в системных программах в последний раз, когда я проверял), поэтому для соблюдения конвенций, санкционированных С.
Windows использует \ r \ n для окончаний строк, Linux (и другие Unix-alikes) используют только \ n. В Windows чтение O_BINARY дает вам необработанные данные, возможно, нечетные окончания строк и все, тогда как O_TEXT нормализует окончание строки, поэтому ваш код C видит только один символ.
В Linux и др. Нет никакого различия между текстом и двоичным кодом, поскольку данные имеют только один символ, поэтому флаги не нужны.