c - 文件描述符消失/无效

标签 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”。

提前致谢,

最佳答案

这些行不一致。

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

data 是一个 char,因此它是 1 个内存字节。 你运行在linux上,如果你有64位机器,int可能是8个字节。因此,您的 sscanf() 会发生内存溢出,可以执行任何操作:覆盖其他变量、损坏堆栈等...将另一个变量设置为 null 可能是其中之一它能做的灾难性事情更少。

关于c - 文件描述符消失/无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36740108/

相关文章:

无法达到 dd 的速度

c - C 中的共享内存

linux - monit 从启动程序命令中删除引号

c - 使用 mmap 将文件读取为字符串

c - 不通过命令行写入文本文件

c - 测量执行函数所花费的时间

linux - 如何在 bash shell 中真正安静地运行 MATLAB?

c - 在实际打开文件之前验证文件路径

c++ - 访问动态数组中的结构中的字符串变量时如何修复 "segmentation fault (core dumped)"错误

c++ - 如何找到鼠标事件的来源?