C fgets不';行不通-
当我没有做任何会影响功能的更改时,fgets突然停止工作 这是我的代码。请让我知道它为什么不工作C fgets不';行不通-,c,file-io,fgets,C,File Io,Fgets,当我没有做任何会影响功能的更改时,fgets突然停止工作 这是我的代码。请让我知道它为什么不工作 void readInfo() {struct grades *grades=malloc(3*sizeof(grades)); char line[60],str[6]; int i=0; FILE *rf=fopen("Grades.txt","r"); if(!feof(rf)&&fgets(line,60,rf)!=NULL) {
void readInfo()
{struct grades *grades=malloc(3*sizeof(grades));
char line[60],str[6];
int i=0;
FILE *rf=fopen("Grades.txt","r");
if(!feof(rf)&&fgets(line,60,rf)!=NULL)
{ puts("inside if1");
while(i<3)
{
sscanf(line,"%d %s %c",&(grades[i]).ID,str,&(grades[i].grade));
strcpy(str,((*(grades+i)).course));
i++;
printInfo(grades+i);puts("herwr");
}
}
fclose(rf);
}
void readInfo()
{struct grades*grades=malloc(3*sizeof(grades));
字符行[60],str[6];
int i=0;
文件*rf=fopen(“Grades.txt”、“r”);
如果(!feof(rf)&&fgets(第60行,rf)!=NULL)
{puts(“内部if1”);
而(i这里是对代码的重写:
未编译,更不用说测试了
变化包括:
- 不为等级分配数组-您永远不会重用该值
- 缺少的
free()
没有问题
- 正在测试文件是否已打开
- 如果文件未打开,则不尝试关闭该文件
- 允许更大的线-这是无痛的,避免了问题
- 检查
sscanf()
是否成功
- 打印接受的分数
其他可能性:
- 删除诊断打印。它们是临时的,但在事情没有按您所希望的方式运行时可能有用
- 最好将文件名作为参数传递给函数
- 如果文件无法打开(并且消息应该包括文件名),如果有错误报告可能会更好,通常写入标准错误
- 如果要处理多达三条坡率线,可以这样做
- 如果要处理数量不定的坡面线,可以这样做
- 如果你想返回等级数组,你可以这样做(但是你怎么说数组有多大?有多种可能性)
所有这些都需要对编码进行一些更改,尽管没有什么异常复杂。fgets()
可以工作-您可能没有正确使用它,但是fgets()
有效。请学习正统的缩进和布局样式。不要在一行上放多个语句。不要在一行上放多个右大括号。fscanf
接受目标参数str
,但char*str
没有为其分配内存。使用fgets()
读取一行是明智的,但是在循环中使用fscanf()
读取下一行可能不是您想要的。这可能是对sscanf()
的调用。您应该检查scanf()中任何一个的返回值
你确实打电话给家人,以确保一切正常。使用下标符号(&grades[i].grade
)比使用替代符号(&(*(grades+i)).grade)
)更为清晰……奇怪的是,你继续使用你最近输入的str
的东西(而且仍然没有分配内存)。
void readInfo(void)
{
int i = 0;
FILE *rf = fopen("Grades.txt", "r");
if (rf != NULL)
{
char line[1024];
while (fgets(line, sizeof(line), rf) != NULL)
{
struct grades grade;
puts("inside while");
if (sscanf(line, "%d %s %c", &grade.ID, grade.course, &grade.grade) == 3)
{
i++;
printInfo(&grade);
}
}
puts("here");
fclose(rf);
}
printf("%d grades accepted\n", i);
}