Как преобразовать текстовый файл в двоичный

Обновлено: 05.07.2024

В компе все данные всегда хранятся в двоичном виде!
Если данные брать по одному байту - получится представление в ASCII!

Таблица ASCII делает соответствие между кодом символа и видимым изображением символа.
Например вы прочитали байт со значением 48 (десятичное), при выводе на экран этого байта получится символ "0" и т.д. У вас явно недопонимание в этом вопросе.

Что и куда вы собрались переводить, а главное зачем?

res2001, допустим, ввожу слово "дом", оно переводится в двоичный код. Затем я задаю цифре 0 белый цвет, а 1 черный, так образуется картинка.

Anton_repr, Переводить никуда не надо, как я писал выше все и так уже в двоичном представлении хранится.
Для определения значений битов в байте используйте битовые операции.
Например:
(val & 0x80) - вернет истину, если старший бит в val выставлен в 1 и ложь в противном случае.

Но лучше берите сразу байтами и делайте градацию из 256 цветов :-) тогда значение прочитанного байта будет индексом в массиве цветов. Работать будет значительно быстрее, чем возня с битами. Именно так используется таблица ASCII при выводе текстовой информации на экран.

Zoominger


Зачем? Изначальная кодировка какая? Может сбиться, если перегонять в ASCII. Переводим все символы в двоичное число и вперёд.

Zoominger

Переводить никуда не надо, как я писал выше все и так уже в двоичном представлении хранится.
Для определения значений битов в байте используйте битовые операции.
Например:
(val & 0x80) - вернет истину, если старший бит в val выставлен в 1 и ложь в противном случае.

Но лучше берите сразу байтами и делайте градацию из 256 цветов :-) тогда значение прочитанного байта будет индексом в массиве цветов. Работать будет значительно быстрее, чем возня с битами. Именно так используется таблица ASCII при выводе текстовой информации на экран.

Я упростил предыдущую задачу, чтобы получить ответ и полностью понять его.

Проблема в том, что я хочу написать программу на C ++, которая преобразует обычный текстовый файл в двоичный файл, а затем читает этот двоичный файл и преобразует его в текстовый файл, чтобы этот текстовый файл соответствовал первому текстовому файлу.
Я написал этот простой код для него.

Теперь что ofs.write(as_bytes(j), sizeof(int)); или же ifs.read(as_bytes(k), sizeof(int)); точно значит?

Мой вопрос почему, на практике файл name1 содержит цифру 5 и ее размер составляет 1 байт. name2 содержит некоторый символ / знак, как [] и его размер составляет 4 байта и name3 содержит цифру 0, а ее размер составляет 1 байт?

Я буду полностью признателен за ваши ответы.

Решение

write а также read методы используются для операций ввода-вывода с двоичными файлами.

У них есть следующие прототипы:

write пишет size байты из memory_block в связанный файл.

read читает size байты из связанного файла и записывает его в memory_block

Например, в вашем случае

пишет байты j номер в бинарный файл с именем name2 ,

Вы можете увидеть больше о вводе и выводе с файлами Вот .

Почему ты не номер пять в имени2 пять

Вы пишете байты j переменная к name2 файл в режиме двоичного ввода / вывода. В этом режиме любая операция ввода-вывода выполняется независимо от соображений формата. Это не добавляет возврат каретки после письменных данных. Это означает, что вы не можете прочитать name2 файл и увидеть пять чисел там.

Почему у вас есть нулевое число в файле name3

Причина в опечатке 🙂

Сначала посмотрите на линии

А затем посмотрите на строки

Вы пытаетесь прочитать байты из уже закрытого объекта файлового потока. Любая операция с такими объектами заканчивается ошибкой. Вы можете проверить это следующим образом:

Это возможно, потому что read возвращает изменчивую ссылку на ifs а также ifs конвертируется в логическое значение.

Из-за всего вышеперечисленного в этом разделе, значение переменной k остаться без изменений.
Вы не можете читать из закрытого файла, вы не можете изменить k значение. Из-за этого старый
ценность k написано в name3 файл.

Это можно сделать по разному. В зависимости от того что ты понимаешь под бинарным фалом. Уточни.

>szBuffer нужно преобразовать как-то в бинарник и записать в файл
что ты имеешь в виду? такой способ работы с файлами как у тебя не делает различия между текстовым и бинарным режимом открытия файла.
афайк текстовые файлы как сущность введены только в Windows libc для перевода \n -> \x0A\x0D и обратно.

Текстовой файл - он изначально уже бинарник. Ибо любой файл на диске - он в любом случае УЖЕ бинарник, т.к. хранится в бинарном представлении.

Что именно тебе нужно - для меня загадка. Твой код вполне корректно прочитает и сохранит файл из одного места в другое (неважно текстовой он или графический). Блох я правда в нём не искал.

Попробуй почетче переформулировать вопрос. Помни, что когда ведут речь о "текстовых файлах" противопоставляя их "бинарным" имеют ввиду только вопрос трактовки символа(ов) т.н. "новой строки/переноса строки".
Есть два варианта:

В DOS-txt файлах переносом строки является последовательность из 2-х символов с кодами 13 и 10 (в десятичной системе).
В UNIX-txt файлах переносом строки является одиночный символ с кодом 13.

Повторяю - и первый и второй варианты тем не менее "двоичны/бинарны" по своей компьютерной сути.
Вопрос только в том что какую именно последовательность двоичных символов ты воспринимаешь как перенос строки. Вот и вся разница.

а нужно например 3,1415926535 перевести в этот бред чтоб потом читать только с бинарника

Конишуа
да, я открываю *.txt читаю данные в буфер, а как конвертнуть данные в буфере они там ведь в тексте

>афайк текстовые файлы как сущность введены только в Windows libc для перевода
>\n -> \x0A\x0D и обратно.

В CP/M и его наследнике DOS-е, поэтому началом новой строки текстового файла приняты обе команды.
В юникс решили на этом вопросе сэкономить и оставили только 13. Но тут то выплывала проблема совместимости с печатными устройствами. Так что, по моим догадкам понятие текстового файла появилось именно в unix.

dx
Ну всё правильно. Так и должнобыть. bmp - не текст ведь. А что бы записать 3,1415926535 в этот "бред" нужно сделать так:

У меня есть txt файл с номерами вроде 541399.531 261032.266 16.660 (первая строка) 541400.288 261032.284 16.642 (2-я строка). сто пунктов. Я хочу преобразовать этот файл в двоичный формат. Кто-нибудь может мне помочь?

В С++ просто откройте файл для чтения, а затем скопируйте его в другой файл в виде двоичного файла.

Я предлагаю избегать записи двоичных представлений в файл на несколько сотен или тысяч точек. Это называется микро-оптимизацией, а время разработки перевешивает любой выигрыш в производительности исполняемого файла.

Не стоит сохранять для размера

В современных вычислениях большинство платформ поддерживают огромные (гигабайтные) размеры файлов, а компьютеры имеют мегабайты или гигабайты памяти для используемых программ. Поэтому запись в двоичном формате для экономии места (размер файла или размер памяти) не дает каких-либо существенных преимуществ по сравнению с другими узкими местами в цикле разработки.

Не очень выигрыш в производительности.

Идея о том, что загрузка двоичного представления из файла более эффективна, чем перевод текстового представления, верна. Тем не менее, большинство процессоров могут переводить ASCII-перевод быстрее, чем двоичные данные могут быть прочитаны. Резюме: время, полученное путем удаления перевода, затмевается более крупными потребителями времени, такими как ввод-вывод файлов и контекстные переключатели.

Снижение полезности данных

Другие приложения могут обрабатывать текстовое представление чисел с плавающей запятой, чем двоичное представление. С текстовым представлением данные могут быть легко использованы в электронных таблицах, текстовых процессорах и инструментах анализа. Файлы, содержащие двоичные представления, требуют больше усилий. Когда вы в последний раз пытались прочитать файл двоичных чисел с плавающей запятой в электронную таблицу? Не оценивайте будущий потенциал файлов данных.

Профиль до оптимизации.

Изменение представления данных является одной из форм оптимизации. Правилами оптимизации (в порядке важности) являются:

Т екстовые файлы хранят данные в виде текста (sic!). Это значит, что если, например, мы записываем целое число 12345678 в файл, то записывается 8 символов, а это 8 байт данных, несмотря на то, что число помещается в целый тип. Кроме того, вывод и ввод данных является форматированным, то есть каждый раз, когда мы считываем число из файла или записываем в файл происходит трансформация числа в строку или обратно. Это затратные операции, которых можно избежать.

Текстовые файлы позволяют хранить информацию в виде, понятном для человека. Можно, однако, хранить данные непосредственно в бинарном виде. Для этих целей используются бинарные файлы.

Выполните программу и посмотрите содержимое файла output.bin. Число, которое ввёл пользователь записывается в файл непосредственно в бинарном виде. Можете открыть файл в любом редакторе, поддерживающем представление в шестнадцатеричном виде (Total Commander, Far) и убедиться в этом.

Запись в файл осуществляется с помощью функции

Функция возвращает число удачно записанных элементов. В качестве аргументов принимает указатель на массив, размер одного элемента, число элементов и указатель на файловый поток. Вместо массив, конечно, может быть передан любой объект.

Запись в бинарный файл объекта похожа на его отображение: берутся данные из оперативной памяти и пишутся как есть. Для считывания используется функция fread

Функция возвращает число удачно прочитанных элементов, которые помещаются по адресу ptr. Всего считывается count элементов по size байт. Давайте теперь считаем наше число обратно в переменную.

fseek

Одной из важных функций для работы с бинарными файлами является функция fseek

Эта функция устанавливает указатель позиции, ассоциированный с потоком, на новое положение. Индикатор позиции указывает, на каком месте в файле мы остановились. Когда мы открываем файл, позиция равна 0. Каждый раз, записывая байт данных, указатель позиции сдвигается на единицу вперёд.
fseek принимает в качестве аргументов указатель на поток и сдвиг в offset байт относительно origin. origin может принимать три значения

  • SEEK_SET - начало файла
  • SEEK_CUR - текущее положение файла
  • SEEK_END - конец файла. К сожалению, стандартом не определено, что такое конец файла, поэтому полагаться на эту функцию нельзя.

В случае удачной работы функция возвращает 0.

Дополним наш старый пример: запишем число, затем сдвинемся указатель на начало файла и прочитаем его.

Вместо этого можно также использовать функцию rewind, которая перемещает индикатор позиции в начало.

В си определён специальный тип fpos_t, который используется для хранения позиции индикатора позиции в файле.
Функция

используется для того, чтобы назначить переменной pos текущее положение. Функция

используется для перевода указателя в позицию, которая хранится в переменной pos. Обе функции в случае удачного завершения возвращают ноль.

возвращает текущее положение индикатора относительно начала файла. Для бинарных файлов - это число байт, для текстовых не определено (если текстовый файл состоит из однобайтовых символов, то также число байт).

Рассмотрим пример: пользователь вводит числа. Первые 4 байта файла: целое, которое обозначает, сколько чисел было введено. После того, как пользователь прекращает вводить числа, мы перемещаемся в начало файла и записываем туда число введённых элементов.

Вторая программа сначала считывает количество записанных чисел, а потом считывает и выводит числа по порядку.

Примеры

1. Имеется бинарный файл размером 10*sizeof(int) байт. Пользователь вводит номер ячейки, после чего в неё записывает число. После каждой операции выводятся все числа. Сначала пытаемся открыть файл в режиме чтения и записи. Если это не удаётся, то пробуем создать файл, если удаётся создать файл, то повторяем попытку открыть файл для чтения и записи.

2. Пишем слова в бинарный файл. Формат такой - сначало число букв, потом само слово без нулевого символа. Ели длина слова равна нулю, то больше слов нет. Сначала запрашиваем слова у пользователя, потом считываем обратно.

3. Задача - считать данные из текстового файла и записать их в бинарный. Для решения зачи создадим функцию обёртку. Она будет принимать имя файла, режим доступа, функцию, которую необходимо выполнить, если файл был удачно открыт и аргументы этой функции. Так как аргументов может быть много и они могут быть разного типа, то их можно передавать в качестве указателя на структуру. После выполнения функции файл закрывается. Таким образом, нет необходимости думать об освобождении ресурсов.

4. Функция saveInt32Array позволяет сохранить массив типа int32_t в файл. Обратная ей loadInt32Array считывает массив обратно. Функция loadInt32Array сначала инициализирует переданный ей массив, поэтому мы должны передавать указатель на указатель; кроме того, она записывает считанный размер массива в переданный параметр size, из-за чего он передаётся как указатель.

5. Создание таблицы поиска. Для ускорения работы программы вместо вычисления функции можно произвести сначала вычисление значений функции на интервале с определённой точностью, после чего брать значения уже из таблицы. Программа сначала производит табулирование функции с заданными параметрами и сохраняет его в файл, затем подгружает предвычисленный массив, который уже используется для определения значений. В этой программе все функции возвращают переменную типа Result, которая хранит номер ошибки. Если функция отработала без проблем, то она возвращает Ok (0).

6. У нас имеются две структуры. Первая PersonKey хранит логин, пароль, id пользователя и поле offset. Вторая структура PersonInfo хранит имя и фамилию пользователя и его возраст. Первые структуры записываются в бинарный файл keys.bin, вторые структуры в бинарный файл values.bin. Поле offset определяет положение соответствующей информации о пользователе во втором файле. Таким образом, получив PersonKey из первого файла, по полю offset можно извлечь из второго файла связанную с данным ключом информацию.

Зачем так делать? Это выгодно в том случае, если структура PersonInfo имеет большой размер. Извлекать массив маленьких структур из файла не накладно, а когда нам понадобится большая структура, её можно извлечь по уже известному адресу в файле.

email

Всё ещё не понятно? – пиши вопросы на ящик

Читайте также: