ошибка seg при чтении из двоичного файла, созданного тем же кодом - PullRequest
0 голосов
/ 05 августа 2011

Я написал этот код для создания двоичного файла с числами с плавающей запятой, но в конце я получаю ошибку ошибки сегментации. Он записывает в файл 9000 чисел с плавающей запятой, но при чтении читает только 4096 из них. Когда я запускаю исполняемый файл несколько раз, считываемое число байтов переключается между 4096, 8192 и 9000. Но у меня всегда есть ошибка seg ...

float *realRef = new float [length];  //then filling it out...


ofstream out("blah.bin", ios::out | ios::binary);

out.write((char *) &realRef, length*sizeof(float));  //length is 9000
out.close();    

ifstream in("blah.bin", ios::in | ios::binary);

float *readTest= new float[length];

in.seekg(0, ios::end);
size_t size=in.tellg();   // printing size shows 4096 BUT it should be 9000
in.seekg(0, ios::beg);

in.read((char *) &readTest, size);    
cout << in.gcount() << " bytes read." << endl;

in.close();

Ответы [ 4 ]

2 голосов
/ 05 августа 2011

В вашем коде есть ошибка. Нет необходимости брать адреса указателей.

//out.write((char *) &realRef, length*sizeof(float));
out.write((char *) realRef, length*sizeof(float));

//in.read((char *) &readTest, size);
in.read((char *) readTest, size);
1 голос
/ 05 августа 2011

Ваш код обновлен:

out.write((char *) realRef, length*sizeof(float));  //length is 9000
<p>
in.read((char *) readTest, size);
</p>

Вы передавали адрес указателя.

0 голосов
/ 05 августа 2011

В первой строке есть ошибка:

float *realRef = new float [length];

new возвращает указатель на вновь выделенную память.Скобки массива также переводятся в указатель.Таким образом, в действительности вы делаете

float* realRef = float**(malloc(...))

Правильный способ сделать это будет

float* realRef = float[length]
0 голосов
/ 05 августа 2011

Сегфо, потому что вы читаете и пишете сами указатели, а не то, на что указывает.Удалите & из операторов записи и чтения.

Также, как правило, рекомендуется проверить значение, возвращаемое записью, чтобы узнать, сколько фактически было написано.

...