getc和getwc:他们究竟是如何读取标准输入的?

时间:2009-07-27 01:55:36

标签: c string

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

我无法确切了解getcgetwc的工作原理。并不是我不能使用它们,而是更像我不知道它们到底做了什么。 intgetc返回大多数字符,如果我'printf(“%c”)它们,包括多字节,如€或甚至£。

我的问题是:这些功能究竟是如何运作的,他们如何阅读stdin 完全?对文档的解释和指示非常感谢。

编辑:请阅读我在William的回答中留下的评论。它有助于澄清我所追求的细节水平。

3 个答案:

答案 0 :(得分:3)

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

fgetc()显然是为多字节字符工作的原因是因为构成多字节字符的字节是单独读取的,单独写出然后由控制台解释为多字节字符。如果您将printf更改为:

printf("%c ", somechar);

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

如果您真的想知道它们的工作原理,请查看glibc的来源。

对于初学者,来自getc()的{​​{1}}会调用libio/getc.c _IO_getc_unlocked(),该libio/libio.h会在__uflow()上调用libio/genops.c

跟踪调用链可能会有点乏味,但你要求它;)