C 中使用 while 循环 (scan("%s", &2dArray)) != EOF) 读取文件时会得到额外的行,这是为什么?

问题描述 投票:0回答:1

我正在尝试读取一个包含 35 行文本的文件,文件中的数字将被转换为字母等级并在代码中稍后输出到控制台。

文件本身是一个有 35 行的文本文件,第一行在这段代码中被跳过,其余的被读入,

文件中的行示例看起来像(粗体是我要阅读的内容)

Image of the file

601000002001010906001 5323 #0001 是 AAAAAA AAA A **1122334321135 113132311412413 ** 009 601000003001010906001 5323 #0001 是 BBB BBBBBBB B **12231342434321223333122142111 ** 005 601000004001010906001 5323 #0001 是 CCCCCCCCC CCCCC **24342323213151331233454432214 ** 005

附件是带有输出的图像,第 35 行不应该在那里。 Image of the current console output, line 35 should not be here

我的代码看起来像这样(是的,它可能到处都是,我已经尝试通过大量调试来解决这个问题有一段时间了。

int getAnswer(char answer[][TOTAL_QUESTIONS])
{
    char c;
    int row = 0;
    int column = 0;
    char garbage[1000];

    while (scanf("%s", &answer[row][column]) != EOF)
    {
        // if(row < 34) {
        skipNchar(77);
        for (column = 0; column < TOTAL_QUESTIONS; column++)
        {
                scanf("%c",&c);
                if (c == ' ' || c == '*')
                    answer[row][column]=' ';
                else
                    answer[row][column] = c;
        }
        // scanf("%c", &c);
        answer[row][column] = '\0';
        row++;
        column = 0; //}
    }

    return row;
}

为什么我继续从文件中读入多余的一行垃圾?

c while-loop file-io scanf
1个回答
0
投票

在 C 中使用 while 循环 (scan("%s", &2dArray)) != EOF) 读取文件时会得到额外的行,这是为什么?

几乎可以肯定,因为你的最后一行有尾随空格,很可能是换行符。当且仅当

scanf()
首次尝试读取时标准输入已位于 EOF 时,
EOF
才会返回
scanf
。相反,如果它成功读取任何字符,无论它对它们做什么(也就是说,即使它只是跳过它们),那么情况就不同了。

scanf()
能够读取任何字符时,其返回值指示有多少以提供的格式描述的字段被成功匹配和转换。可以是 0。通常测试
scanf()
是否转换了预期的字段数比测试(仅)它是否报告达到 EOF 更合适。在你的情况下,那就是

    while (scanf("%s", &answer[row][column]) == 1) // ...

此外,强大的程序会检查每个

scanf
调用的结果(以及对任何其他有办法指示发生错误的函数的每次调用)的结果。循环内的
scanf()
调用未得到适当检查。 (我会在那里使用
getchar()
,但这不会改变需要检查返回值的点。)

© www.soinside.com 2019 - 2024. All rights reserved.