【问题标题】:Segmentation fault when reading binary file读取二进制文件时出现分段错误
【发布时间】:2014-11-22 18:11:52
【问题描述】:

我正在尝试从现有二进制文件中读取数据,但我得到的只是分段错误。 我认为它可能来自结构,所以我使用了一个临时数组来尝试填充值,但问题似乎来自 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;
    }

} 

【问题讨论】:

  • For 循环条件最好使用&amp;&amp;,但这仍然不能消除提取不应基于while (!eof()) 的事实。

标签: c++ segmentation-fault fstream


【解决方案1】:

由于您没有提供可编译的示例,因此很难说,但是从外观上看,问题出在:

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

您还应该将循环条件更改为使用&amp;&amp;;现在,如果文件中包含超过 3 个字节,您将溢出 arrarray 并且可能还会出现段错误:

for (int i = 0; i < cMAX_ADRESS_SIZE && !ifile.eof(); i++) {

【讨论】:

  • 对不起,我是新来的,忘了给你的答案投票。但你的回答是真实的
猜你喜欢
  • 2014-05-02
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-17
相关资源
最近更新 更多