Задать вопрос
@kytcenochka

Запись вектора в бинарный файл, циклом — C++?

Есть файл 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[i * 6], row * sizeof(short));
        }
    }
    fout.close();
    return 0;


Подскажите, как исправить второй цикл, чтоб записывать поэлементно
  • Вопрос задан
  • 1423 просмотра
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>
#include <algorithm>


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, " "));

	std::ofstream fout("data.dat", std::ios::out | std::ios::binary);		
	const size_t columnCount = 6;
	for (size_t i = 0; i < vec.size(); i+= columnCount)
	{
		int index = i / columnCount + 1;
		fout.write((char *)&index, sizeof(int));
		for (size_t j = 0; j < columnCount; j++)
		{
			fout.write((char*)&vec[i + j], sizeof(short));
		}
	}
	
	fout.close();
	return 0;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
индекс (4 байта) + 6 значений из вектора по 2 байта

Значит правильно выбирайте размер данных. int, в общем случае, может иметь размер 16, 32 или 64 бита, в зависимости от системы и компилятора, short - от 8 до 64 бит.
Используйте int32_t для 4-байтовых и int16_t для 2-байтовых чисел (__int32 и __int16 в старых версиях Visual C++).

Cтруктура вектора содержит не значения, записанные в вектор, а указатели на начало и конец блока памяти, выделенного для хранения этих значений (https://stackoverflow.com/questions/27466373/memor... Реализация этой структуры зависит от компилятора. Поэтому в строке
fout.write((char*)&vec[i * 6], row * sizeof(short));

вы получаете не данные, а байты из структуры вектора.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы