getc和getwc:他们是如何读取标准文本的?

getc和getwc:他们是如何读取标准文本的?,c,string,C,String,我不确定这是否是一个愚蠢的问题,但我想我很快就会发现 我无法准确理解getc和getwc的工作原理。并不是说我不能使用它们,而是更像是我不知道它们到底做什么int和getc返回大多数字符,如果我`printf(“%c”)它们,包括多字节字符,比如欧元或偶数 我的问题是:这些函数到底是如何工作的,它们是如何准确地读取stdin的?非常感谢对文档的解释和良好提示 编辑:请阅读我在威廉的回答中留下的评论。这有助于澄清我所追求的详细程度。答案取决于平台。在类unix机器上,getc检查缓冲区中是否有可用

我不确定这是否是一个愚蠢的问题,但我想我很快就会发现

我无法准确理解
getc
getwc
的工作原理。并不是说我不能使用它们,而是更像是我不知道它们到底做什么
int
getc
返回大多数字符,如果我`printf(“%c”)它们,包括多字节字符,比如欧元或偶数

我的问题是:这些函数到底是如何工作的,它们是如何准确地读取stdin的?非常感谢对文档的解释和良好提示


编辑:请阅读我在威廉的回答中留下的评论。这有助于澄清我所追求的详细程度。

答案取决于平台。在类unix机器上,getc检查缓冲区中是否有可用数据。如果不是,则调用read()获取缓冲区中的一些数据,返回下一个字符,并递增文件指针(和其他详细信息)。细节在不同的实现中有所不同,对开发人员来说并不重要。

如果您在一个具有8位字符(即UCHAR_MAX==255)的系统上,那么getc()将返回一个8位字符。它返回int的原因是,可以将EOF值与任何可能的字符值区分开来。这几乎是你今天可能遇到的任何系统

fgetc()显然适用于多字节字符的原因是,组成多字节字符的字节分别被读入、写出,然后由控制台解释为多字节字符。如果将printf更改为:

printf("%c ", somechar);

(也就是说,在每个字符后面加一个空格)然后你会看到多字节字符被分解成它们的组成字节,这可能看起来很奇怪。)

如果你真的想知道它们是如何工作的,请查看源代码

对于初学者来说,
libio/getc.c
中的
getc()
将调用
\u IO\u getc\u unlocked()
,它在
libio/libio.h
中定义,并将在下溢时从
libio/genops.c
中调用
\u uflow()


跟踪呼叫链可能会有点乏味,但这是您自找的;)

谢谢,威廉,但我想知道尽可能多的关于这件事的信息。例如,你叫什么“数据”,一个字节?还有别的吗?它真的返回角色吗?如果字符是多字节的,但它仍然可以正常打印(如“€”)会怎样?有许多编码,其中€不是多字节。无论如何,如果getc()从多字符输入流(例如UTF-8编码)中读取一个字节,这只意味着在屏幕上显示该字符之前,还需要进行几个getc/putc调用。getc在unix上一次读取一个字节。