При использовании системного уровня ввода-вывода в Linux я заметил, что компилятор распознал флаги O_RDONLY
и O_RDWR
, но не имел никакого представления о значении флагов O_BINARY
и O_TEXT
.
Это ли это Linux?
При использовании системного уровня ввода-вывода в 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 для конкретной платформы, вы обнаружите, что они не знают об этом различии текста/двоичного кода.
Это a * nix вещь. * Операционные системы nix не выполняют автоматическое преобразование строк для ввода-вывода в текстовых файлах, поэтому флаги O_TEXT и O_BINARY не имеют смысла.
На уровне ОС между двоичным и текстовым файлом в Unix нет разницы. Текстовый файл имеет ограниченный контент. Это также верно для Windows, но соглашения, используемые C для конца строк, такие же, как и для Unix, в то время как Windows использует пару CR/LF (и явный конец маркера файла в некоторых контекстах, но обработка это было непротиворечиво даже в системных программах в последний раз, когда я проверял), поэтому необходимо сопоставить соглашения, предусмотренные C.
Windows использует \r\n для окончаний строк, Linux (и другие Unix-аликс) используют только \n. В Windows чтение O_BINARY дает вам необработанные данные, возможно, нечетные окончания строк и все, тогда как O_TEXT нормализует окончание строки, поэтому ваш C-код видит только один символ.
В Linux и др. нет никакого смысла различать текст и двоичный файл, потому что данные имеют только один символ, поэтому флаги не нужны.