Использование fstream для чтения из двоичного файла и сохранения результатов в векторе

Я работаю над проектом для своего класса CS202. У меня есть предоставленный двоичный файл неизвестного размера с именем data.dat, и мне нужно прочитать целые числа (которые я не знаю заранее) из файла и сохранить их в векторе правильного размера. Я должен использовать fstream() для файлового потока, и я должен использовать reinterpret_cast<char *>() для преобразования. Мой код выглядит так:

fstream filestream2;
//reading binary data from supplied data.dat file
filestream2.open("data.dat", ios::in | ios::binary);
vector<int> v;
filestream2.seekg(0, filestream2.end);
long length = filestream2.tellg();
v.resize(length);
filestream2.read(reinterpret_cast<char *>(&v[0]), length);
for(int num = 0; num < length; num++)
{
    cout << v[num] << " ";
}

Теоретически вектор должен содержать все целые числа из файла и выводить их на стандартный вывод, но мой вывод просто около 50 000, 0 с последующим program exited with exit code 0. Я относительно новичок в синтаксисе и библиотеках C++, и я просто не могу понять, что я я делаю неправильно для жизни меня. Заранее спасибо.


person Zachary Mason    schedule 14.09.2017    source источник


Ответы (2)


Когда вы используете

filestream2.seekg(0, filestream2.end);
long length = filestream2.tellg();

вы получаете количество символов в файле, а не количество элементов в векторе. Следовательно, вам нужно будет использовать length/sizeof(int), когда вы хотите использовать размер вектора.

v.resize(length);

это неверно. Это должно быть

v.resize(length/sizeof(int));

и

for(int num = 0; num < length; num++)
{
    cout << v[num] << " ";
}

это неверно. Это должно быть

for(int num = 0; num < length/sizeof(int); num++)
{
    cout << v[num] << " ";
}
person R Sahu    schedule 14.09.2017

Вы сказали, что «вы не знаете заранее», какие данные (размер данных) хранятся в файле. Основная проблема заключается в определении размера данных и их типа данных. Итак, что вы можете сделать, так это создать собственный файл форматирования.

Например

  • 1-й байт файла будет указывать тип данных (например, I для целого числа, F для числа с плавающей запятой, U для беззнакового целого числа, C для char, S для char * (строка) и т. д.)
  • Следующие 4 байта будут размером данных (требуется только для char*, поэтому это необязательно)
  • После этого фактическая дата будет начата.

Таким образом, данные будут в файле, например

Cabcdefghijk

Здесь 1-й байт - это C, поэтому данные будут char. Поэтому нужно создать вектор типа char.

Следующий размер данных:

fstream.seekg(0, fstream.end);
long length = fstream.tellg(); //  length : 12

length -= 1; // 1st byte is indecator // length : 11

// length -= 4; // Optional : if you had write size of data
length = length / sizeof( char); //  sizeof( int) or sizeof( flot) or written in file.
// so in our case length will be 11;

Теперь у вас есть тип данных и размер данных, поэтому создайте или измените размер вектора соответственно.

person Piyush Sonani    schedule 15.09.2017