Запись вектора из текстового файла в бинарный?

229
20 июня 2018, 22:40

Есть файл input.txt с таким содержимым:

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

Записала содержимое в вектор и хочу записать в бинарный файл data.dat только поэлементно с индексом строки. Файл должен иметь структуру: индекс (4 байта) + 6 значений из вектора по 2 байта.

**01 00 00 00** 01 00 02 00 03 00 04 00 05 00 06 00 **02 00 00 00** 07 00 08 00 и т.д. 

Вот мой код, но пишет неправильно

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;
int main()
{
    std::fstream input("input.txt");
    std::vector<short> vec; // значения из файла
    std::copy(std::istream_iterator<int>(input), std::istream_iterator<int>(), std::back_inserter(vec));
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
    ofstream fout("data.dat", std::ios::out | ios::binary);
    int countstring = 5;
    int index = 0;
    int row = 6;
    for (int i = 0; i <= countstring; i++) {
        index = i + 1;
        fout.write((char *)&index, sizeof index);
        for (size_t j = 0; j < row; ++j)
        {
            fout.write((char*)&vec[0], vec.size() * sizeof(vec));
        }
    }
    fout.close();
    return 0;

Подскажите решение, пожалуйста!

Answer 1

Вам нужно именно с вектором? У меня вышло как-то вот так, без вектора (файл в результате занимает 80 байт, вроде верно, но читать не пробовал)

#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>
#include <string>
#include <sstream>
int main(int argc, char* argv[])
{
    //Поток чтения
    std::fstream input("input.txt");
    //Поток вывода (бинарный)
    std::ofstream output("data.dat", std::ios::out | std::ios::binary);
    //Строчка
    std::string str;
    //Номер стрчоки
    int stringNumber = 0;
    //Считать построчно файл до конца
    while (std::getline(input,str))
    {
        //Значение числа из строки
        short val = 0;
        //Строковой поток для читаемой строки
        std::stringstream strStream(str);
        //Запись индекса строки
        output.write(reinterpret_cast<char*>(&stringNumber), sizeof(int));
        //Пока есть числа в строке
        while (strStream >> val) {
            //Запись значения
            output.write(reinterpret_cast<char*>(&val), sizeof(short));
        }
        //Увеличение индекса строки
        stringNumber++;
    }
    std::cout << "Done." << std::endl;
    system("pause");
    return 0;
}
READ ALSO
Ошибка с преобразованием

Ошибка с преобразованием

При вызове этой функции компилятор выдает ошибку

495
Правильная выгрузка DLL

Правильная выгрузка DLL

Делаю следующие события:

155
No match &#39;operator = &#39; in std::vector

No match 'operator = ' in std::vector

Всем доброго вечера!

193