我有一个文件,格式为:
课程-成绩计数-成绩
Programming 10 3 4 5 4 3 2 4 5 2 3
Mathematics 8 3 3 4 5 3 2 2 3
Physics 6 3 4 5 3 4 5
Design 6 5 4 5 3 2 4
Logistics 8 3 4 5 3 1 1 2 4
例如:课程-编程,成绩等级-10和成绩-3 4 5 4 3 2 4 5 2 3
我已经有
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define SIZE 70
int main(void)
{
char subject[SIZE];
int gradeCount;
int grades[SIZE];
FILE *fp = fopen("C:\\Project\\project.txt", "r"); //opening already created file
if (fp == NULL) {
perror("Error opening file");
return(-1);
}
for (int i = 0; i < SIZE; i++) {
fscanf(fp, "%s %d", &subject[i], &gradeCount);
printf("%s \n", &subject[i]);
//printf("%d \n", gradeCount);
for (int k = 0; k < gradeCount; k++)
{
fscanf(fp, "%d", &grades[k]);
// printf("%d \n" , grades[k]);
}
if (i == SIZE) {
break;
}
}
fclose(fp);
return 0;
}
我需要毫无问题地打印出“课程”,“成绩计数”和“成绩”,稍后我需要进行搜索,因此我需要将它们彼此分开,但事实并非如此,现在,当我先输出“主题/课程”,然后输出“成绩计数”,最后是“成绩”时,我将向您展示所有情况的输出。
对于课程:
Programming
Mathematics
Physics
Design
Logistics
ogistics
gistics
istics
stics
tics
ics
cs
s
@
@@
@
@
对于成绩计数:
10
8
6
6
8
8
8
8
8
8
8
8
8
8
8
8
8
8
8
8
对于成绩:
3
4
5
4
3
2
4
5
2
3
3
3
4
5
3
2
2
3
3
4
5
3
4
5
5
4
5
3
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
在所有情况下,其他东西都会添加到应打印出来的原始内容中,我不知道它来自哪里,我想到过指针,但对它们却不了解。有什么建议么?
只需正常打印所有内容,以后再正常搜索所有内容(课程,成绩计数和成绩)即可。
答案 0 :(得分:0)
如果无法读入任何内容,则需要提早退出循环。您可以通过检查fscanf
的返回值来做到这一点。如果第一个调用没有返回2,则说明它没有读入2个值,因此可以break
退出循环。
由于处理字符串,您还错误地调用了fscanf
和printf
。您正在移动读/打印的起点,这是不需要的,并减少了可用的最大空间。
更新后的代码看起来像这样
for (int i = 0; i < SIZE; i++) {
if(fscanf(fp, "%s %d", subject, &gradeCount) != 2) {
break;
}
printf("%s ", subject);
//printf("%d \n", gradeCount);
for (int k = 0; k < gradeCount; k++)
{
fscanf(fp, "%d", &grades[k]);
// printf("%d" , grades[k]);
}
}