我有一个文件 inp,它看起来像:
123.456 one
111.111 two
222.222 three
444.444 four
我正在尝试像这样读取这个文件:
while(fscanf(inp, "%s %s", s1, s2) != EOF)
其中 123.456
存储在 s1
(字符串)中,“one”
存储在 s2
(字符串)中。
但是我得到这个错误:
Thread 1:EXC_BAD_ACCESS (code = 1, address = 0x48)
知道为什么或如何解决此错误吗?
这是我的全部代码:
int main(void)
{
FILE *inp;
char s1[15];
char s2[8];
inp = fopen("inputfile.txt", "r");
while(fscanf(inp, "%s %s", s1, s2) != EOF)
{
printf("%s", s1);
}
return 0;
}
我的调试区显示“123.456”存入s1,“一”存入s2。
最佳答案
除了缺少 stdio.h
包含 (a) 之外,该代码没有任何问题。因此,您的问题要么出在其他地方(例如,如果您正在编译一个不同的文件),要么您的编译器有问题(不太可能)。
你可以通过简单地做一个小的改变来判断它是否是第一个:
#include <stdio.h>
int main (void) {
FILE *inp;
char s1[15];
char s2[8];
puts ("Hello from Pax");
inp = fopen ("inputfile.txt", "r");
if (inp == NULL) {
puts ("Couldn't open input file");
} else {
while (fscanf (inp, "%s %s", s1, s2) != EOF) {
printf ("[%s] [%s]\n", s1, s2);
}
}
return 0;
}
看看是否有新消息出来。我建议调试的更改只是 Hello from Pax
输出,但我还稍微清理了代码以捕获一些可能的问题。
在我的系统上,该代码输出:
Hello from Pax
[123.456] [one]
[111.111] [two]
[222.222] [three]
[444.444] [four]
正如预期的那样。
(a) 需要注意的一个可能性是 int
和指针宽度不同的系统中缺少包含文件。如果您的编译器假定非原型(prototype)函数接受 int
参数,这可能会导致参数从堆栈的错误位置提取。
This answer 显示了这个特殊的小缺陷在不匹配的 printf
格式说明符的作用下,您可能会从 fscanf
看到相同的行为,因为它使用相同的功能。
但这只是我的有根据的假设,它可能不适用于这里。
关于c - 带有 fscanf 的 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20027628/