循环中的fgetc
调用将在fscanf
完成的地方开始,但您应该知道这一点将在最后一个扫描项目之后的下一个字符处。假设它工作正常,那将是\n
第二行末尾的字符(假设您事先在该行的开头,这似乎是您的代码注释的情况)。
因此,第一个fgetc
将为您提供上述\n
,下一个将'I'
在第三行的开头为您提供 ,依此类推。
如果您遇到车祸,我会立即检查一些事情。
第一个是c
typeint
而不是char
. 这是必需的,以便您可以从中接收任何有效char
类型以及EOF
指示器。
第二个是message
足够大以容纳数据。
第三个是i
初始化为零。
为了安全起见,您可能还应该检查您的扫描是否可以读取十个数字。
查看以下完整程序以了解如何执行此操作。您会注意到我还在检查以确保缓冲区不会由于文件中的数据过多而溢出:
#include<stdio.h>
int main(void)
{
// Open file for reading.
FILE *Data = fopen ("qq.in", "r");
if (Data == NULL) {
puts ("Cannot open qq.in");
return 1;
}
// Skip first and second line (twenty numbers).
int zero, one, two, three, four, five, six, seven, eight, nine;
int numRead = fscanf(Data, "%d %d %d %d %d %d %d %d %d %d", &zero, &one,
&two, &three, &four, &five, &six, &seven, &eight, &nine);
if (numRead != 10) {
puts ("Could not read first ten integers");
fclose (Data);
return 1;
}
numRead = fscanf(Data, "%d %d %d %d %d %d %d %d %d %d", &zero, &one,
&two, &three, &four, &five, &six, &seven, &eight, &nine);
if (numRead != 10) {
puts ("Could not read second ten integers");
fclose (Data);
return 1;
}
// Loop for reading rest of text (note initial newline here).
int c, i = 0;
char message[1000];
while(EOF != (c = fgetc(Data))) {
if (i >= sizeof(message)) {
puts ("Too much data");
fclose (Data);
return 1;
}
message[i++] = c;
}
fclose (Data);
printf ("[%*.*s]\n", i, i, message);
return 0;
}
运行时,这会产生:
[
If I were reincarnated, I'd want to come back a
buzzard. Nothing hates him or envies him or wants
him or needs him. He is never bothered or in
danger, and he can eat anything.
-- Mark Twain
]