Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
EricJForster
1 / 1 / 0
Регистрация: 10.06.2016
Сообщений: 32
Завершенные тесты: 1
#1

Запись вектора строк в бинарный файл - C++

09.08.2016, 23:08. Просмотров 247. Ответов 8
Метки нет (Все метки)

Помогите пожалуйста. Компилируется отлично, без ошибок и варнингов, но при запуске выдает ошибку. уже не знаю как быть. не понятно какая ошибка. просто аварийное закрытие.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
using namespace std;
 
int main()
{
    string str1;
    string str2;
    vector<string>vStr1;
    vector<string>vStr2;
    fstream fin("example.txt", ios_base::in);
    while(getline(fin, str1)) {
        vStr1.push_back(str1);
    }
    fin.close();
    for(unsigned int i=0; i<vStr1.size(); ++i) cout << vStr1[i] << endl;
 
    fstream fout("example.bin", ios_base::binary | ios_base::out);
    for(unsigned int i=0; i<vStr1.size(); ++i) {
        int size1 = vStr1[i].size();
        fout.write((char*)&size1, sizeof(vStr1[i].size()));
        fout.write(vStr1[i].c_str(), size1);
    }
    fout.close();
 
    fstream fin2("example.bin", ios_base::binary | ios_base::in);
    for(unsigned int i=0; i<vStr1.size(); ++i) {
        int size1 = vStr1[i].size();
        fin2.read((char*)&size1, sizeof(size1));
        fin2.read((char*)&vStr2[i], size1);
    }
    fin2.close();
 
    for(unsigned int i=0; i<vStr1.size(); ++i) cout << vStr2[i] << endl;
 
    return 0;
}
файл example.txt:

Data Base:
1. Kokoko
2. Lololo
3. Lpdkfjkg
4. Dlmgflg
5. Fldfgogk
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2016, 23:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Запись вектора строк в бинарный файл (C++):

Запись вектора в бинарный файл - C++
Здравствуйте, не получаеться написать нормальную запись в файл вектора из обьектов класа. Вот сам клас: public class Human { ...

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

Запись вектора в бинарный файл. - C++
Ребят помогите кто сделать запись в бинарный файл ,а не в текстовый(как в данном коде ) , а то не выходит как то ! заранее спасибо ! ...

Запись в бинарный файл вектора - C++
есть вектор typedef struct Point { double x; double y; Point(double x_, double y_) : x(x_), y(y_) {} ...

Запись вектора uin8_t в бинарный файл и обратное чтение из файла - C++
Здравствуйте. Есть std::vector&lt;uint8_t&gt;. Нужно записать все элементы в бинарный файл, а затем считать обратно из файла в...

Запись в бинарный файл двумерного строкового вектора и его считывание - C++
Ну ни в какую не могу понять эту работу с файлами( В чем проблема? Заранее спасибо #include &lt;iostream&gt; #include &lt;fstream&gt; ...

8
DevAlone
320 / 272 / 55
Регистрация: 02.08.2016
Сообщений: 1,008
Завершенные тесты: 4
09.08.2016, 23:22 #2
ну, для начала надо поставить проверки на открытие файла. После
C++
1
fstream fin("example.txt", ios_base::in);
должно быть
C++
1
2
3
4
if(!fin.is_open()){
cout << "ошибка открытия файла";
return 0;
}
0
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
09.08.2016, 23:46 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Нельзя вот так просто копировать объекты классов, тем более stl, в файл. Да и в коде чепуха, мягко говоря.
В бинарном файле не будет ни одной строки из example.txt.

Могу предложить следующее:
Пишите 4 байта - размер строки. Далее саму строку.
Примерно так:
C++
1
2
3
unsinged int sz = vStr[ i ].size();
fout.write( (char*)&sz, sizeof( sz ));
fout.write( vStr[ i ].c_str(), sz );
Или же, так как c-строки оканчиваются нулем, можете писать эти самые строки ограничивая их нулем. Читать придется побайтно в данном случае.
C++
1
fout.write( vStr[ i ].c_str(), vStr[ i ].size() + 1 );
Добавлено через 7 минут
Запись в файл у Вас аналогична моему первому варианту. В файл строки все таки запишутся. Здесь у Вас все нормально.
Проблема при чтении из файла. Нельзя делать вот так:
C++
1
fin2.read((char*)&vStr2[i], size1);
Нужно создавать промежуточный массив char'ов и в него писать из файла.

C++
1
2
3
4
5
6
7
8
9
const int BUFF_SIZE = 256;
 
char buff[ BUFF_SIZE ];
...
int size1;
fin2.read((char*)&size1, sizeof(size1));
fin2.read(buff, size1);
buff[ size1 ] = 0;
vStr2.push_back( buff );
Добавлено через 10 минут
Цитата Сообщение от EricJForster Посмотреть сообщение
fout.write((char*)&size1, sizeof(vStr1[i].size()));
И эту строчку поправьте. sizeof( size1 ).
0
EricJForster
1 / 1 / 0
Регистрация: 10.06.2016
Сообщений: 32
Завершенные тесты: 1
10.08.2016, 00:04  [ТС] #4
спасибо большое! разобрался) но одно не особо понятно
Цитата Сообщение от Toshkarik Посмотреть сообщение
fout.write((char*)&size1, sizeof(vStr1[i].size()));
И эту строчку поправьте. sizeof( size1 ).
зачем менять ведь size1 == vStr1[i].size() ?
0
nmcf
5520 / 4830 / 1636
Регистрация: 14.04.2014
Сообщений: 19,608
10.08.2016, 09:46 #5
Цитата Сообщение от EricJForster Посмотреть сообщение
зачем менять ведь size1 == vStr1[i].size() ?
Там не int, может быть и не равно.
0
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
10.08.2016, 11:40 #6
Цитата Сообщение от EricJForster Посмотреть сообщение
зачем менять ведь size1 == vStr1[i].size()
Потому что Вы пишите первым размер строки, который хранится в int, размер которого равен sizeof( int ) ( или sizeof( size1 )).
0
EricJForster
1 / 1 / 0
Регистрация: 10.06.2016
Сообщений: 32
Завершенные тесты: 1
10.08.2016, 11:56  [ТС] #7
Цитата Сообщение от Toshkarik Посмотреть сообщение
Потому что Вы пишите первым размер строки, который хранится в int, размер которого равен sizeof( int ) ( или sizeof( size1 )).
хм... не пойму. ну смотрите:
int sz = vStr[i].size();
sizeof(sz);
идентично же такой записи:
sizeof(vStr[i].size());

или как-то не так?
0
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
10.08.2016, 11:59 #8
EricJForster, нет. std::string::size() возвращает std::size_t, который может быть и 8 байт на 64 битной системе.
0
EricJForster
1 / 1 / 0
Регистрация: 10.06.2016
Сообщений: 32
Завершенные тесты: 1
10.08.2016, 12:03  [ТС] #9
Добавлено через 15 секунд
Цитата Сообщение от Toshkarik Посмотреть сообщение
нет. std::string::size() возвращает std::size_t, который может быть и 8 байт на 64 битной системе.
оо) понял. благодарю!
0
10.08.2016, 12:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2016, 12:03
Привет! Вот еще темы с ответами:

Запись в бинарный файл - C++
Всем привет. Столкнулся с следующей проблемой при написании курсача,а именно с записью в бинарный в файл: дело в том, что я каждый раз...

Запись в бинарный файл - C++
Скажите пожалуйста, правильно ли работает моя программа? (Имеется ввиду запись в бинарный файл) #include &quot;stdafx.h&quot; #include...

Запись в бинарный файл - C++
Здравствуйте. Прошу помочь разобраться с проблемой. Необходимо записать в двоичный файл 8-байтовое число, но не как строку, а...

Запись в бинарный файл - C++
Подскажите пожалуйста,где в коде ошибка??никак найти не могу почему х не считает. В файл записываются 0. Задние на картинке. #include...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru