Двоичный файл .dat вопрос в C ++ - PullRequest
1 голос
/ 09 февраля 2010

Я хотел сжать размер большого текстового файла со значениями с плавающей запятой в двоичный файл .dat, поэтому я использовал (на c ++):

// the text stream
std::ifstream fin(sourceFile);
// the binary output stream
std::ofstream out(destinationFile, std::ios::binary);

float val;
while(!fin.eof())
{
    fin >> val;     
    out.write((char *)&val,sizeof(float));
}
fin.close();
out.close();

Затем я хотел прочитать все значения с плавающей точкой из ранее созданного двоичного файла в массив значений с плавающей точкой. Но когда я пытаюсь прочитать из этого файла, я получаю исключение в последней строке кода (процесс чтения):

// test read
std::ifstream fstream(destinationFile, std::ios::binary);

__int64 fileSize = 0;
struct __stat64 fileStat;  
if(0 == _tstat64(destinationFile, &fileStat))
{
    fileSize = fileStat.st_size;
}

//get the number of float tokens in the file
size_t tokensCount = fileSize / sizeof(float);
float* pBuff = new float[tokensCount];
fstream.read((char*)&pBuff, tokensCount * sizeof(float));

Что я делаю не так?

Ответы [ 3 ]

5 голосов
/ 09 февраля 2010

Обратите внимание, что это:

while(!fin.eof())
{
    fin >> val;     
    out.write((char *)&val,sizeof(float));
}

- неправильный способ чтения файла - в конце он прочитает значение мусора. Вы почти никогда не должны использовать функцию eof(), и вы должны ВСЕГДА проверять, работает ли чтение файла. Правильный код:

while( fin >> val )
{
    out.write((char *)&val,sizeof(float));
}
5 голосов
/ 09 февраля 2010
float* pBuff = new float[tokensCount];
fstream.read((char*)&pBuff, tokensCount * sizeof(float));

Вы читаете в переменную pBuff, а не в буфер, на который она указывает. Вы имеете в виду:

fstream.read((char*)pBuff, tokensCount * sizeof(float));
4 голосов
/ 09 февраля 2010

Ответ Магнуса верный и должен решить вашу проблему. Я только добавлю, что у вас не было бы проблемы с самого начала, если бы вы сделали, как говорят гуру, и не использовали злой бросок в стиле C. Если вы измените свою последнюю строку на это:

fstream.read(static_cast<char*>(&pBuff), tokensCount * sizeof(float));

Тогда ваша программа не сможет скомпилироваться, и сообщение об ошибке приведет вас к решению.

РЕДАКТИРОВАТЬ: мое решение не работает, если pBuff является указателем на любой тип, кроме char. Так что это бесполезно в случае ОП.

...