我试图理解一些基本代码,并且通过以下代码轻微搞糊涂
int main ()
{
FILE *fp;
int c;
int n = 0;
fp = fopen("file.txt","r");
if (fp == NULL)
{
perror("Error in opening file");
return(-1);
}
do
{
c = fgetc(fp);
if ( feof(fp) )
{
break ;
}
printf("%c", c);
} while(1);
fclose(fp);
return(0);
}
有人可以解释一下为什么c是整数类型,即使它是由fgetc(fp)
定义的,据我所知,它只是下一个字符?
答案 0 :(得分:4)
鉴于编写此特定代码的确切方式,c
不需要是int
类型 - 如果c
的类型为{{1},它仍然可以工作}}
大多数从文件中读取字符的代码应该(至少最初)将这些字符读入char
。具体来说,C风格I / O的基本设计的一部分是int
和getc
等函数除了可能来自文件的任何值之外还可以返回EOF。也就是说,可以从文件中读取任何类型fgetc
的值。 char
,getc
等可以通过返回至少一个不会 / 不能拥有的值来表示文件结尾来自文件。它通常是-1,但不保证。签署fgetc
时(现在通常是这样),您可以从文件中获取一个值,当它被分配给char
时,该值将显示为-1,因此,如果您依赖于检测EOF的返回值,这可能导致误检测。
您在问题中包含的代码只是将文件的内容复制到标准输出,一次一个字符。利用EOF返回值,我们可以稍微简化代码,因此主循环看起来像这样:
char
我想有些人可能会觉得这个过分简洁。其他人可能会反对循环条件内的赋值。至少我认为这些是合理而有效的论据,但这仍然适合于图书馆的设计,这是更好的选择。
答案 1 :(得分:1)