Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.97/29: Рейтинг темы: голосов - 29, средняя оценка - 4.97
 Аватар для TierX
21 / 21 / 0
Регистрация: 28.02.2014
Сообщений: 138

Работа с бинарными файлами: какой способ работает наиболее быстро при записи и считывании?

28.09.2014, 02:43. Показов 6137. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет прошу помощи по этой теме. Попробую изложить кратко:
1) Есть не бинарный файл -> Считываю его ifstream -> работаю с данными -> записую в бинарный файл обработанные данные.
2) Открываем наш бинарный файл в другой программе -> считываем данные -> работаем.

Что интересует:
1) При помощи чего можно полноценно работать по данной теме? Пока знаю только fstream и коечто видел про stdio.h но пока не разбирался решил спросить совета тут.
2) Какие краткие + и - у этих способов(либы итд) которые вы назовете включая названые мной. И какой способ работает наиболее быстро в области записи и считывания из файла бинарного кода.

Вопросы/Проблемы:
1) ofstream оператор << не пишет бинарно так же как >> не читает. Частично нашел решение для константных типов данных :
file.write((const char*) &(x),sizeof(float)) итд.
Но строки (w/string) записать не могу(не знаю/не умею/нельзя?). Либо получается просто текстовый код либо бинарный но последующее чтение(ifstream.read()) лупит лишние символы в считываемую строку (записал "abvgd" считало "abvgdMMMMMMMM"). Так как скорость считывания для меня играет большую роль то записывать и считывать строки посимвольно не хотелосьбы.

Тема для меня довольно важна и очень хотелось бы чтоб вы мне помогли по этим вопросам. Заранее спасибо.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.09.2014, 02:43
Ответы с готовыми решениями:

Работа с файлами, какой способ сейчас современный?
Есть программа с настройками и базой данных. Задача сохранить/прочитать настройки и данные базы в файл со своим расширением, а ля...

Существует ли какой-нибудь способ ограничения длины текста при записи из БД в параграф?
Допустим, у меня есть строка в HTML, которая берет данные из БД. &lt;p&gt;&lt;?=$item;?&gt;&lt;/p&gt; Но текст этот может быть неопределенной...

Работа с бинарными файлами
Вот проблемный код: if ($fd = fopen($f, &quot;rb&quot;)) { $temp = tmpfile(); while ( !feof($fd) ) { $b = fread($fd, 1); $x = $b; ...

30
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
28.09.2014, 13:44
Лучший ответ Сообщение было отмечено TierX как решение

Решение

Студворк — интернет-сервис помощи студентам
Цитата Сообщение от alsav22 Посмотреть сообщение
Ответ в ответе на вопрос "И есть ли для строки вобще разница бинарной и не бинарной записи?"
Простая строка это набор нескольких байт, и пишется она в файл как есть без изменений. Поэтому для строки нет такого понятия как бинарно или нет. Теперь о числах. Их можно записать как бинарно так и не бинарно т.е. ПРИ ЗАПИСИ ЧИСЛА НЕ БИНАРНО ОНО СНАЧАЛА КОНВЕРТИРУЕТСЯ В СТРОКУ, И ЭТА СТРОКА ПИШЕТСЯ В ФАЙЛ.
1
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
28.09.2014, 13:54
Сишные касты - зло. c_str() возвращает указатель на константу.
C++
1
2
3
    file1.read((char*)&y, sizeof(int));
    file1.read(&str1[0], y);
    cout << "str1 size: " << y << " str1: " << str1.c_str();
Добавлено через 1 минуту
Ну и методы read разделил, ибо UB - читалось ноль символов.
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
28.09.2014, 14:04
Цитата Сообщение от TierX Посмотреть сообщение
Ну например когда я пытался писать опертором << хоть и был режим ios::binary т.е. я знал каким режимом пишу но результат был не бинарен.
Это я потом узнал что этот оператор не пишет бинарно. Но к чему это... так вот еслибы я в бокноте не увидел то что числа записаны текстово то я бы не обнаружил пробелму. Но еслибы чисел небыло то я бы не обнаружил пробелмы вовсе.
Может быть можно и так знания получать, но может лучше сразу узнать: что, как и почему, а уже потом код писать?

Добавлено через 7 минут
Цитата Сообщение от alsav22 Посмотреть сообщение
когда я пытался писать опертором << хоть и был режим ios::binary т.е. я знал каким режимом пишу но результат был не бинарен.
Это я потом узнал что этот оператор не пишет бинарно.
А я спросил про метод, а не про режим открытия файла (ios::binary):
Цитата Сообщение от alsav22 Посмотреть сообщение
Или вы не знаете каким методом пишете?
Есть режим открытия файл, а есть методы чтения/записи. Комбинации могут быть разными, и будут свои особенности (например, при открытии в бинарном режиме, и использовании текстовых методов, чтение\запись будет быстрее).
1
 Аватар для TierX
21 / 21 / 0
Регистрация: 28.02.2014
Сообщений: 138
28.09.2014, 14:08  [ТС]
Вот наконецто получилось + еще один способ чтение без resize.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Бинарная запись
    string str = "hello im your 4 candy today!";
    int x = str.length();
    ofstream file("out.txt",ios::binary);
    file.write((const char*) &(x),sizeof(int)).write(str.c_str(),str.length());
    file.close();
 
    // Чтение
    ifstream file1("out.txt",ios::binary);
    string str1;
    int y=0;
    file1.read((char*)&y, sizeof(int));
    str1.resize(y);
    file1.read(&str1[0], y);
    cout << "str1 size: " << y << " str1: " << str1.c_str();
 
    // тоже работает  resize делать не нужно.
    /*
    file1.read((char*)&y,sizeof(int));
    getline(file1,str1);
    cout<<"str1 size: "<<y<<" str1: "<<str1.c_str();*/

C fstream немного вроде разобрался.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
28.09.2014, 14:13
TierX, getline будет читать до разделителя - переноса строки. Так что не подходит.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
28.09.2014, 14:18
Цитата Сообщение от TierX Посмотреть сообщение
+ еще один способ чтение без resize.
Если у вас, в файле, будет не одна строка, то getline() будет искать '\n' (по умолчанию), а где он у вас в файл записывается? Не нужно методы смешивать.
0
 Аватар для TierX
21 / 21 / 0
Регистрация: 28.02.2014
Сообщений: 138
28.09.2014, 14:28  [ТС]
0x10, Хм а если так вроде работает?
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Бинарная запись
    string str = "hello im your 4 candy today!\n";
    int x = str.length();
    string str2 = "hello im your #INF trouble today!\n";
    int x2 = str2.length();
    ofstream file("out.txt",ios::binary);
    file.write((const char*) &(x),sizeof(int)).write(str.c_str(),str.length());
    file.write((const char*) &(x2),sizeof(int)).write(str2.c_str(),str2.length());
    file.close();
 
    // Чтение
    ifstream file1("out.txt",ios::binary);
    string str1,str3;
    int y=0,y2=0;
    
 
    // тоже работает  resize делать не нужно.
    
    file1.read((char*)&y,sizeof(int));
    getline(file1,str1);
    file1.read((char*)&y2,sizeof(int));
    getline(file1,str3);
    cout<<"str1 size: "<<y<<" str1: "<<str1.c_str()<<endl<<"str2 size: "<<y2<<" str1: "<<str3.c_str();


str1 size: 29 str1: hello im your 4 candy today!
str2 size: 34 str1: hello im your #INF trouble today!
Для продолжения нажмите любую клавишу . . .

Теперь про
Ну наверно самый быстрый это Api (CreateFile, ReadFile, WriteFile).
Я так понял это WinApi? И нужен просто #include <windows.h>.
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
28.09.2014, 14:31
Цитата Сообщение от TierX Посмотреть сообщение
Я так понял это WinApi? И нужен просто #include <windows.h>.
Да. Я же привел там готовый пример.
1
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
28.09.2014, 14:35
Цитата Сообщение от TierX Посмотреть сообщение
Хм а если так вроде работает?
И получается смешение двух идеологий в одном формате файла. Теперь используются как методы для чтения сырых данных, так и текстовые. Очень хочется потом поддерживать такой бардак?
0
 Аватар для TierX
21 / 21 / 0
Регистрация: 28.02.2014
Сообщений: 138
28.09.2014, 14:36  [ТС]
0x10, Нехочется делать ресайз. Хтотя тут я незнаю какой из способов быстрее. Может ресайз + read быстрее одного getline. нужно будет проверить на огромном файле! Ж)
maxillion, Вы порсто написали Api. Они то разные бывают)
Буду разберать теперь этот способ. Потом добавлю результат.

Всем большое спасибо что расчехлили дурня
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
28.09.2014, 14:42
Цитата Сообщение от TierX Посмотреть сообщение
Вы порсто написали Api. Они то разные бывают)
По ссылке есть пример мапирования файла. Это ещё быстрее.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.09.2014, 14:42

Работа с бинарными файлами
Всем привет, дали задание Дано целое число K и файл, содержащий неотрицательные целые числа. Вывести K-й элемент файла (элементы...

Работа с бинарными файлами
Создать текстовый файл с произвольным текстом. Разработать программу, которая выводит на экран по желанию пользователя: а) N первых строк...

Работа с бинарными файлами
Добрый день, нужно реализовать метод который будет заносить рандомную матрицу(двумерный массив) в бинарный файл, заносит вектор(одномерный...

Работа с бинарными файлами
Создать бинарный файл с информацией о работниках предприятия: 1) фамилия 2) возраст 3) образование 4) должность 5) пол Вывести...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru