文件描述符消失/无效

时间:2016-04-20 09:54:07

标签: c linux segmentation-fault fopen scanf

我正在使用Debian并在C中编写了一个简单的文件解析程序。我要打开的文件大约有32k行,格式严格:

number,number\n
number,number\n
and so on ...

我的代码:

int main(int argc, char* argv[])
{
    char data = 0;
    int addr = 0;
    char buf[50] = {0};

    FILE* myfile = fopen("eelocdump.txt", "r");

    if(myfile == NULL)
    {
        printf("File open error\n");
        return 1;
    }

    while (fgets(buf, 50, myfile ) != NULL)
    {
        sscanf(buf, "%5d,%3d\n", &addr, &data);
        printf("%d,%d\n", addr, data);
    }

    fclose(myfile);

    return 0;
}

由于一些奇怪的原因,我不明白,我的代码读取文件的第一行,写出来,然后是段错误。花了大约一个小时后,我发现对sscanf的调用导致文件描述符被设置为NULL。

我找到了一个“修复”,我几乎不敢这么说:

    while (fgets(buf, 50, myfile) != NULL)
    {
        sscanf(buf, "%5d,%3d\n", &addr, &data);
        printf("%d,%d\n", addr, data);

        myfile = myfile;
    }

添加这个明显的语句使我的代码工作,写出所有32k行。这几乎令人满意,因为这不应该改变任何东西。 (sscanf也不应影响文件描述符)

你能帮我正确解决这个问题吗?我真的不喜欢把它称为“magic”。

提前致谢,

1 个答案:

答案 0 :(得分:2)

这些行不一致。

char data = 0;
/* ... */
    sscanf(buf, "%5d,%3d\n", &addr, &data);

datachar,因此它是1个内存字节。 你在linux上运行,如果你有64位机器,int可能是8个字节。所以你的sscanf()做了一个可以做任何事情的内存溢出:覆盖其他变量,破坏堆栈等等......将另一个变量设置为null可能是它可以做的灾难性事件之一。 / p>