我正在尝试读取一个包含 35 行文本的文件,文件中的数字将被转换为字母等级并在代码中稍后输出到控制台。
文件本身是一个有 35 行的文本文件,第一行在这段代码中被跳过,其余的被读入,
文件中的行示例看起来像(粗体是我要阅读的内容)
601000002001010906001 5323 #0001 是 AAAAAA AAA A **1122334321135 113132311412413 ** 009 601000003001010906001 5323 #0001 是 BBB BBBBBBB B **12231342434321223333122142111 ** 005 601000004001010906001 5323 #0001 是 CCCCCCCCC CCCCC **24342323213151331233454432214 ** 005
我的代码看起来像这样(是的,它可能到处都是,我已经尝试通过大量调试来解决这个问题有一段时间了。
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 循环 (scan("%s", &2dArray)) != EOF) 读取文件时会得到额外的行,这是为什么?
几乎可以肯定,因为你的最后一行有尾随空格,很可能是换行符。当且仅当
scanf()
首次尝试读取时标准输入已位于 EOF 时,EOF
才会返回 scanf
。相反,如果它成功读取任何字符,无论它对它们做什么(也就是说,即使它只是跳过它们),那么情况就不同了。
当
scanf()
能够读取任何字符时,其返回值指示有多少以提供的格式描述的字段被成功匹配和转换。可以是 0。通常测试 scanf()
是否转换了预期的字段数比测试(仅)它是否报告达到 EOF 更合适。在你的情况下,那就是
while (scanf("%s", &answer[row][column]) == 1) // ...
此外,强大的程序会检查每个
scanf
调用的结果(以及对任何其他有办法指示发生错误的函数的每次调用)的结果。循环内的 scanf()
调用未得到适当检查。 (我会在那里使用 getchar()
,但这不会改变需要检查返回值的点。)