我有一个包含20行文本(编号和名称)的文本文件。我想从文本文件中读取这些内容,然后将它们用作函数中的参数。
我的文本文件包含大约20行,如下所示:
719 Chris
我有下面的代码,但它不起作用,并给出EXC_BAD_ACCESS (code=1, address=0x68)
void read() {
int number;
char name;
char buffer[200];
FILE *fp = fopen("text.txt", "r");
while (fgets(buffer, sizeof(buffer), fp)) {
printf("%d %s\n", &number, name);
add(name, number)
}
fclose(fp);
}
2条答案
按热度按时间acruukt91#
您没有检查文件是否成功打开。如果
fopen
返回NULL
,并且该值存储在fp
中,则函数调用fgets(buffer, sizeof(buffer), fp)
将调用undefined behavior(即您的程序可能崩溃)。还有,这条线
将调用未定义的行为,原因有二:
%d
转换格式说明符要求您传递int
类型的参数,但您传递的却是int*
类型的参数。%s
转换格式说明符要求您传递char *
类型的参数,但您传递的却是char
类型的参数。传递
name
也是没有意义的,因为它从来没有被赋值过,你可能想用buffer
来代替,因为它包含了你刚刚用fgets
读取的行。我的猜测是您希望使用函数
sscanf
而不是printf
,如下所示:但是,在这种情况下,必须将
name
更改为数组,以便它可以存储多个字符,而不是仅存储单个字符。下面是完整的代码,它修复了上面提到的所有问题:
请注意,要使用函数
exit
,您必须使用#include <stdlib.h>
。5uzkadbs2#
我发现有几点我觉得很奇怪:
add()
函数是做什么的?为什么它的末尾没有分号?(就像add(name, number);
一样)1.您应该添加一个
fclose(fp);
来关闭流。1.在
printf()
中,使用标志%s
来打印字符,除了%s
打印字符串,替换为%c
。1.您尝试通过
&number
打印number的地址,但它是%p
标志而不是%d
标志。number
和name
至少在printf()
中的第一次传递时看起来为空(并且未初始化!)。