文件描述符 disappearing/nullifying
File descriptor disappearing/nullifying
我用的是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。
我找到了一个我不敢这么命名的"fix":
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
可能是它可以做的灾难性较小的事情之一。
我用的是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。
我找到了一个我不敢这么命名的"fix":
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
可能是它可以做的灾难性较小的事情之一。