Binary VS Text Mode for File I/O Operations
When we try to read or write files in our program, usually there are two modes to use. Text mode, usually by default, and binary mode. Obviously, in text mode, the program writes data to file as text characters, and in binary mode, the program writes data to files as 0/1 bits. While it sounds trivial to distinguish the two modes, people sometimes got confused. Since the computer only reads and writes in binary formats, where is this text mode coming from?
In this blog post, I am going to talk about the conceptual difference between the text mode and the binary model, and discuss some caveats of using them.
Example
We have a signed int -10000 , an unsigned short 100 , and a C string WE . Their binary sequence representations in an 64-bit computer is as follows.
signed int -10000 :
unsigned short 100 :
Note that C string always has a 0 at the end of the string.
When we save the three values to file, the binary sequence of the file is simply a concatenation of all the values.
Binary Mode
The binary mode is very easy to understand. For each piece of the data on the computer, they are represented as binary sequences on the memory or hard drive.
Writing File
To save the data in binary mode, we simply take the exact binary sequence representing the data, and save it to the file. Nothing fancy.
Reading File
Because the saved file has no knowledge about the data structure of its content, to read the data saved in binary mode, the users would need to implement the decoding method themselves.
Expected Output of the Example Using Binary Mode
When the computer sees the binary sequence from the binary file, it would have no clue to decode it back to the original values. It is our users’ responsibility to tell the computer, the first 4 bytes represent a signed int , the next 2 bytes represent an unsigned short , and the next 3 bytes represent a C string, so that the computer would know how to decode.
Code Example
We implemented a code example binaryIO.cpp for saving data in binary mode.
We compiled the above code using the following command.
We ran the executable and got the following outputs.
Be aware that the numeric values are saved with the order of bytes reversed, which is an endianness artifact of my x86 platform (x86 architecture uses the little-endian convention). Except for this, everything saved to the file matches our expectation.
The size of the saved file is exactly 9 bytes.
In addition, because of the endianness artifact, to decode a binary file in another platform, we will have to know the endianness of the encoding platform. Otherwise, the values might not be decoded correctly.
Text Mode
The text mode is nothing special but converts the data to string format, and use the binary representation of the string to represent the data.
Writing File
Because the encoding and decoding methods, such as ASCII and UTF-8, of string characters have been implemented already. The user does not have to implement any encoding and decoding methods, but let the program know which encoding and decoding methods to use. Some of the data which could be implicitly converted to strings could also be saved using the text mode. However, the data which could not be converted to strings could not be saved using the text mode.
When there is more than one value to be saved into the file, it is the user’s responsibility to parse the text. Usually, the user would use some special delimiters such as \n to separate different values.
Reading File
Similarly, because the base unit of the text is character. When it comes to reading the file using the text mode, the program would just have to read the file byte by byte, and decode each byte to character using the decoding method the user-specified.
Expected Output of the Example Using Text Mode
When the computer sees the binary sequence from the text file, since each byte is a character, it would just decode byte to character one by one.
Code Example
We implemented a code example textIO.cpp for saving data in binary mode.
We compiled the above code using the following command.
We ran the executable and got the following outputs.
Note that 00001010 is the delimiter \n . Except for the three delimiters we inserted, everything else matches our expectations.
The size of the saved file is exactly 15 bytes. Even if we do not count the three delimiters inserted, the size would be 12 bytes.
Conclusions
Writing data using the binary mode takes smaller disk or memory sizes comparing to writing data using the text mode. That’s why large data storage and low latency file transmission often use binary formats.
The shortcoming of the binary mode is that you should know the data structure and the exact methods for decoding the data. Implementation of the decoding method for each specific data structure would be time consuming. However, with the rise of libraries for handling the binary encoding and decoding for different data structures, such as Google’s Protocol Buffer, we could handle the writing and reading for binary files more easily for most of the common data structures.
Языки Си-семейства и бинарные файлы: что нужно знать

Программирование включает в себя множество разнообразных языков. С их помощью программисты и разработчики «общаются» с компьютерами и иными устройствами, а также с приложениями. У каждого – свои собственные особенности и нюансы, синтаксис и правила.
При написании софта приходится задействовать разнообразные files и функции. Чтобы создать качественную утилиту, необходимо помнить обо всех особенностях выбранного языка. Но некоторые возможности используются не слишком часто. Из-за этого они «забываются».
Современные программеры активно используют Си-семейство в своей работе. Google указывает, что сюда включают:
- C (Си);
- C++ (Си Плюс-Плюс);
- C# (Си Шарп).
Эти языки стали универсальными и удобными. У них много схожих файлов и функций. Но новичкам освоить данные способы «общения» с компьютерами бывает непросто.
Терминология – что пригодится
Можно написать хороший софт только тогда, когда пользователь хорошо разбирается в том, что он делает. Си-семейство схоже между собой, но каждый язык имеет ключевые особенности.
Перед началом работы с бинарными файлами и Fgets требуется запомнить некоторые ключевые термины. К ним относят следующие понятия:
- базовый класс – класс, от которого осуществляется наследование;
- выражение – сочетание операторов, литералов и переменных, которые интерпретируются согласно установленным правилам языка;
- деструктор – метод класса, который отвечает за деинициализацию объекта;
- идентификатор – имя, присвоенное «элементу» в кодификации;
- класс – некий шаблон, отвечающий за определение формы объекта;
- конструктор – метод класса, используемый при инициализации;
- литерал – фиксированное значение, не изменяемое приложение;
- массив – переменные одного типа, обращение к которым производится по общему «названию»;
- объект – своеобразный экземпляр класса;
- параметры – переменные, получаемые из аргументов, передаваемый функции при вызове;
- переменная (наиболее частый формат – int i) – именованная ячейка памяти;
- строка – последовательность символов, заключенная в двойные кавычки;
- структура – шаблон, определяющий форму объекта с открытыми членами;
- указатель – объект, содержащий так называемый адрес памяти;
- функция – подпрограмма, в которой находится одно или несколько приложения Си, задействованных для определенных задач.
Это – основная терминология для всего Си-семейства. Если какие-то слова при создании кодов не понятны, можно всегда обратиться к помощи Google.
Файлы – виды
C-программирование требует определенных навыков и умений. Для обучения можно использовать Google – там полно полезной информации и даже примеров кодификаций. Но без практики и первоначальных знаний добиться успехов не получится.
В записанных и успешно работающих утилитах есть так называемые файлы. Предназначаются для хранения информации в том или ином виде.
- бинарные файлы в c;
- текстовые файлы.
Каждый используется для чтения и записи собственного «формата». Файл сам по себе, согласно данным из Google – это способ хранения информации.
В C нет операторов для работы с файлами. Необходимые манипуляции производятся при помощи функций стандартной библиотеки <stdio.h>.
Текстовый файл — понятие
Текстовый файл – файл, который содержит текстовые данные. Разбивается на строки посредством специального «разделительного» символа, используемого для обозначения окончания строчки или последовательности:
- в Unix – одиночный символ перевода строки;
- в Windows – после символа перевода строчки устанавливается знак возврата каретки.
В текстовый файл мы записываем кодификации и «простой текст». То, что нужно записать. Это не особый формат информации.
Бинарный файл – что это
Если посмотреть данные в Google по file в C, можно увидеть, что есть еще и так называемые двоичные «элементы». Это – файлы, из которых осуществляется считывание или вывод байтов. Подразумевается их предоставление программеру в «сыром» виде. То есть, без связывания и подстановок.
Разница между файлами
Некоторые перед написанием кода задумываются, в чем разница между указанными видами файлов. Пример – картинка и звуковой документ. Чем они отличаются друг от друга?
Звуковой файл интерпретируется через специальные приложения в звуки, а второй «документ» — в изображение. Аналогичным образом согласно Google ситуация обстоит и рассматриваемыми files. Текстовые рассматриваются в виде «обычного текста», а бинарные интерпретируются в качестве набора двоичных чисел.
В текстовых файлах символ «\n» при записи переводится в «\r\n», при считывании осуществляется так называемая образная замена. В случае с бинарными «элементами» подобный прием не работает ни при каких обстоятельствах.
Особенности работы с бинарными «элементами»
Текстовый файл – понятие далеко не новое. Оно встречается не только в программировании. В Google можно отыскать четкое определение оному. И работа с «обычным текстом» при написании кодификаций не такая уж трудная.
Сложнее использовать двоичный файл. Он встречается в кодах чаще всего. В основном используется для записи чисел и значений.
Для того, чтобы в Си-семействе (в C++ в особенности) работать с бинарными файлами, согласно Google, используется стандартная библиотека. Для текстовых применяются:
- fscanf;
- fpintf.
Бинарные файлы тоже используют соответствующие «архивы», но с некоторыми корректировками. Пример – для чтения используют не параметр «r», а «rb». Работа осуществляется непосредственно с битами. Доступ к данным осуществляется произвольным образом.
Доступ к информации в функции
Для того, чтобы получить доступ к информации в функции произвольно, записывается следующая кодификация:
Fseek (переменная, расстояние, seek_set или seek_cur или seek_end).
Здесь имеет место следующая расшифровка:
- seek_set – открываем файл и ведем отсчет от начала;
- seek_cur – непосредственно от установленного курсора;
- seek_end – конец файла.
Для того, чтобы рассчитать расстояние (битов, на «размер» которых сдвигается указатель), используют sizeof().
Запись и чтение
Немаловажным моментом является запись и чтение. При помощи Google можно разобраться с тем, как создается и используется поток поступаемой информации при обработке кода. Но без «базы» осознать соответствующую информацию не выйдет.
Для записи бинарного файла (из данных Google) используется запись:
Fwrite (ссылка на записываемую информацию, размер, количество «сведений», файловая переменна).
Для того, чтобы осуществить чтение соответствующего документа, задействуется функция под называнием fread. Параметры у нее будут аналогичные.
Fgets – для чего нужна функция
Текстовые файлы согласно Google используются не только обычными юзерами, но и опытными программерами весьма часто. Работать с ними нужно уметь, особенно если речь заходит о написании кодификаций.
Полезной является функция fGets. Это – чтение строки из указанного потока данных с последующим сохранением в виде строчки в параметр string. Происходит это до тех пор, пока приложение не дойдет до конца файла.
Символ новой строки закрывает работу fGets, но служит допустимым. Связано это с тем, что происходит копирование оного в строчку string. Нулевой символ добавляется после прочитанных. Указывает на конец str.
Функция имеет вид: char *fgets (char *str, int num, FILE *stream) – вместо char допускается использование void. Аргументы расшифровываются следующим образом:
- str – указатель на массив, в котором осуществится размещение считанной строчки;
- num – предельно допустимая длина строчки, попадающей под считывание;
- stream – поток данных (указатель на него).
Если чтение строчки успешно, Google говорит, что произойдет возвращение указателя на массив, в который помещены прочитанные сведения. В противном случае программному коду предстоит открыть файл, «просмотреть» его и вернуть значение NULL.
Когда при чтении осуществляется ошибка, возвращается NULL, а в переменную errno происходит запись кода ошибки. А состояние массива, в котором должна была сохраниться строчка, не определяется.
Пример
Вот наглядный пример использования fgets:
В ходе описанного кода произойдет считывание file.txt или первых 99 символов. Все зависит от того, какое именно из событий осуществляется раньше. Результаты выводятся на экран.
Теперь ясно, что такое двоичный файл в c, а также текстовый file. Для чего они используются, тоже. Если хочется более полно изучить соответствующую тему, рекомендуется отправиться на специализированные компьютерные курсы. Их можно пройти дистанционно. Там расскажут не только о файлах в Си-семействе, но и о fgets и иных функциях.
Бинарные (двоичные) и текстовые файлы
Двоичный (бинарный) файл — в широком смысле: последовательность произвольных байтов. Название связано с тем, что байты состоят из бит, то есть двоичных (англ. binary) цифр.
В узком смысле слова двоичные файлы противопоставляются текстовым файлам. При этом с точки зрения технической реализации на уровне аппаратуры, текстовые файлы являются частным случаем двоичных файлов, и, таким образом, в широком значении слова под определение «двоичный файл» подходит любой файл.
Текстовый файл — компьютерный файл, содержащий текстовые данные, как правило, организованные в виде строк. Текстовой файл, как и прочие файлы, хранится в файловой системе. Текстовым файлам противопоставляются двоичные файлы, в которых содержатся данные, не рассчитанные на интерпретацию в качестве текста (например, файлы, хранящие закодированные звук или изображение).
В отличие от термина «текстовой формат», характеризующего содержимое данных, термин «текстовой файл» относится к самому файлу как контейнеру, хранящему такие данные. Текстовой файл может содержать не только текст как таковой, но и текст с разметкой в виде текстовых пометок — к примеру, HTML-текст.
Текстовой файл представляет собой последовательность символов и знаков препинания (принадлежащих тому или иному набору символов). Эти символы обычно сгруппированы в строки (англ. lines, rows). В современных системах строки разделяются разделителями строк, хотя в прошлом применялось хранение строк в виде записей постоянной или переменной длины. Иногда конец текстового файла (особенно если в файловой системе не хранится информация о размере файла) также отмечается одним или более специальными знаками, известными как маркеры конца файла.
Текстовой файл может содержать как форматированный, так и неформатированный текст.
5.2. Функция открытия файла — базовая функция при работе с файлам. Особенности обращения к файлам
5.2.1. Синтаксис функции открытия файла
Любой операции с файлами, затрагивающей его содержимое, должна предшествовать операция открытия файла fopen, которая открывает файл на чтение или запись.
Синтаксис этой функции приведён ниже:
int fopen (string filename, string mode, [, int use_include_path [,
resource zcontext]])
Здесь обязательные параметры – это:
filename — имя открываемого файла в узком смысле (имя расширение) или абсолютный путь к нему (имя файла в широком смысле). Например: fopen(«c:/www/html/file.txt»,»r»). Если абсолютный путь не указывается, то файл должен находиться в текущем каталоге проекта PHP. Вместо абсолютного пути может использоваться эквивалентная ему запись относительного пути до файла 37 .
mode – задаёт режим открытия файла (для чтения или записи). То есть задаёт информацию о том, для каких действий открывается файл и может принимать следующие значения:
‘r’ — открыть файл только для чтения; после открытия указатель файла устанавливается в начало файла;
‘r+’ — открыть файл для чтения и записи; после открытия указатель файла устанавливается в начало файла;
‘w’ — создать новый пустой файл только для записи; если файл с таким именем уже есть, вся информация в нем уничтожается;
‘w+’ — создать новый пустой файл для чтения записи; если файл с таким именем уже есть, вся информация в нем уничтожается;
‘a’ — открыть файл для дозаписи; данные будут записываться в конец файла;
‘a+’ — открыть файл для дозаписи и чтения данных; данные будут записываться в конец файла;
‘x’ — файл с указанным именем создаётся и открывается для записи, если файл уже существует, то функция открытия файла возвращает значение FALSE, свидетельствующее об ошибке;
‘x+’ – файл создаётся и открывается для чтения и записи, если по ошибке такой параметр будет применён к уже существующему файлу, то функция возвратит значение FALSE.
При работе в ОС Windows, дополнительно к приведённым выше значениям параметра mode, можно указывать, какой файл — двоичный или текстовый будет обрабатывать операционная система. Этот параметр добавляется к нужному значению mode, обозначается через b и носит название флага:
‘b’ — флаг, указывающий на работу (чтение и запись) с двоичным файлом; указывается только в Windows.
Необязательные параметры — это:
use_include_path – если файл надо искать в каталогах, указанных в параметре include_path конфигурационного фала php.ini, то значение указанного параметра должно быть выставлено равным 1 или TRUE.
Вот так, в частности, выглядит этот параметр в стандартной настройке файла конфигурации системы XAMPP 38 (Пример 5 -52):
Text vs. Binary Files
![]()
In Computer Science, every file is just a pile of 1s and 0s, but (I want to distinguish between) there are really 2 types of files. Human readable vs. non-human readable. Text vs. binary.
You can open any file on your computer here and see that each is just a bucket of 1s and 0s (although they will show here as hexidecimal — just another number system. See the ASCII chart below).
(youtube — opening any file)
The file extension on files are only there to let the operating system what ‘default program’ to use when running the file.
But to explain the difference between text and binary, let’s look at what a .txt file looks like vs. a Microsoft Word file (.docx).
YouTube- writing “hello, my name is Robert” in both text and binary.
The first can be controlled with code and the second typically needs an SDK to interact with it. For instance, if I want to write an Excel file I have to use a library to
(open source vs. proprietary)
Or .csv file (comma separated values) and a .xlsx file (Excel file).
It’s the reason an .xlsx file can have formatting like cell colors, tables, formulas, etc. while a .csv file can’t have any of that. Same with a word file…you can have underlining, bold, italics, fonts, etc. whereas in a .txt file you can’t have any of that. All that extra formatting has to be encoded into the file itself, which makes it far more complex.