我正在尝试从现有的二进制文件中读取数据,但我得到的只是一个分段错误。 我认为它可能来自struct,所以我使用了一个临时数组,我尝试填充值,但问题似乎来自ifstream读取函数。有人可以帮我解决这个问题吗?
bool RestoreRaspberry::RestorePhysicalAdress(TAddressHolder &address) {
mPRINT("now i am in restore physical address\n");
/*
if (!OpenFileForRead(infile, FILENAME_PHYSICALADDRESS)){
printf("\nRestoreUnit: Error open file Restore Physical Address\n");
return false;
}
*/
ifstream ifile;
ifile.open(FILENAME_PHYSICALADDRESS, ios_base::binary | ios_base::in);
if (!ifile.is_open())
{
printf("\nRestoreUnit: Error open file Restore Physical Address\n");
return false;
}
printf("\nRestoreUnit: now trying to read it into adress structure\n");
uint8 arr[3];
//the problem occurs right here
for (int i = 0; i < cMAX_ADRESS_SIZE || !ifile.eof(); i++) {
ifile.read(reinterpret_cast<char *>(arr[i]), sizeof(uint8));
}
#ifdef DEBUG
printf("physical address from restoring unit: ");
/*
printf("%#x ", address.Address[0]);
printf("%#x ", address.Address[1]);
printf("%#x \n", address.Address[2]);
*/
printf("%#x", arr[0]);
printf("%#x ", arr[1]);
printf("%#x \n", arr[2]);
#endif
ifile.close();
if (!ifile){//!CloseFileStream(infile)){
printf("\nRestoreUnit: Error close file Restore Physical Address\n");
return false;
}
}
答案 0 :(得分:3)
很难说,因为你没有提供一个可编辑的例子,但从它的外观来看问题就在这里:
ifile.read(reinterpret_cast<char *>(arr[i]), sizeof(uint8));
您正在将uint8
重新解释为char *
。这意味着arr[i]
中保存的任何内容(由于您没有初始化它而未定义)被解释为将读取值的地址。我相信这就是你的意图:
ifile.read(reinterpret_cast<char *>(&arr[i]), sizeof(uint8));
或者,可以说更清楚:
ifile.read(reinterpret_cast<char *>(arr + i), sizeof(uint8));
您还应该将循环条件更改为使用&&
;现在,如果文件中包含超过3个字节,您将超出arr
数组,并可能在那里发生段错误:
for (int i = 0; i < cMAX_ADRESS_SIZE && !ifile.eof(); i++) {