fgetc使用说明
Clarification on the use of fgetc
我得到的函数的一部分有以下代码:
char ch;
ch = fgetc(fp);
if (ch == EOF)
return -1;
其中 fp
是作为参数传递给函数的 pointer-to-FILE/stream。
然而,检查了fgetc()
、getc()
和getchar()
的用法后,似乎它们都是return类型int而不是char类型,因为EOF不适合 char 中使用的值 0-255,因此通常 < 0(例如 -1)。但是,这让我提出三个问题:
- 如果
getchar()
returns int,为什么 char c; c = getchar();
是函数的有效用法?在这种情况下,C 是否会自动类型转换为 char,并且在 getchar()
被替换为 getc(fp)
或 fgetc(fp)
的情况下?
- 当
fgetc()
或其他两个函数return EOF 时程序会发生什么?它会再次尝试像以前一样转换为 char 但随后失败了吗? ch
中存储了什么?
- 如果 EOF 实际上不是一个字符,
ch == EOF
如何进行有效比较,因为 EOF 不能用 char 变量表示?
If getchar() returns int, why is char c; c = getchar(); a valid usage of the function?
不是。仅仅因为您可以编写并且编译器(以某种方式)允许您编译它,并不能使代码有效。
我相信以上回答了所有问题。
补充一下,如果返回EOF
,则不能存储在char
中。 char
的符号是实现定义的,因此,根据第 6.3.1.3 章,C11
When a value with integer type is converted to another integer type other than _Bool, if
the value can be represented by the new type, it is unchanged.
Otherwise, if the new type is unsigned, the value is converted by repeatedly adding or
subtracting one more than the maximum value that can be represented in the new type
until the value is in the range of the new type.60)
Otherwise, the new type is signed and the value cannot be represented in it; either the
result is implementation-defined or an implementation-defined signal is raised.
我得到的函数的一部分有以下代码:
char ch;
ch = fgetc(fp);
if (ch == EOF)
return -1;
其中 fp
是作为参数传递给函数的 pointer-to-FILE/stream。
然而,检查了fgetc()
、getc()
和getchar()
的用法后,似乎它们都是return类型int而不是char类型,因为EOF不适合 char 中使用的值 0-255,因此通常 < 0(例如 -1)。但是,这让我提出三个问题:
- 如果
getchar()
returns int,为什么char c; c = getchar();
是函数的有效用法?在这种情况下,C 是否会自动类型转换为 char,并且在getchar()
被替换为getc(fp)
或fgetc(fp)
的情况下? - 当
fgetc()
或其他两个函数return EOF 时程序会发生什么?它会再次尝试像以前一样转换为 char 但随后失败了吗?ch
中存储了什么? - 如果 EOF 实际上不是一个字符,
ch == EOF
如何进行有效比较,因为 EOF 不能用 char 变量表示?
If getchar() returns int, why is char c; c = getchar(); a valid usage of the function?
不是。仅仅因为您可以编写并且编译器(以某种方式)允许您编译它,并不能使代码有效。
我相信以上回答了所有问题。
补充一下,如果返回EOF
,则不能存储在char
中。 char
的符号是实现定义的,因此,根据第 6.3.1.3 章,C11
When a value with integer type is converted to another integer type other than _Bool, if the value can be represented by the new type, it is unchanged.
Otherwise, if the new type is unsigned, the value is converted by repeatedly adding or subtracting one more than the maximum value that can be represented in the new type until the value is in the range of the new type.60)
Otherwise, the new type is signed and the value cannot be represented in it; either the result is implementation-defined or an implementation-defined signal is raised.