C-比文件更大的输出(大小问题)

时间:2018-11-21 13:08:48

标签: c arrays scanf

我有一个文件,格式为:

课程-成绩计数-成绩

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

在所有情况下,其他东西都会添加到应打印出来的原始内容中,我不知道它来自哪里,我想到过指针,但对它们却不了解。有什么建议么?

只需正常打印所有内容,以后再正常搜索所有内容(课程,成绩计数和成绩)即可。

1 个答案:

答案 0 :(得分:0)

如果无法读入任何内容,则需要提早退出循环。您可以通过检查fscanf的返回值来做到这一点。如果第一个调用没有返回2,则说明它没有读入2个值,因此可以break退出循环。

由于处理字符串,您还错误地调用了fscanfprintf。您正在移动读/打印的起点,这是不需要的,并减少了可用的最大空间。

更新后的代码看起来像这样

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]);
    }
}