getc , getchar , fgetc 或 getw 子例程
用途
从输入流获取字符或字。
库
标准 I/O 软件包 (libc.a)
语法
#include <stdio.h> FILE *Stream;
int fgetc (Stream)
FILE *Stream; int getchar (void) int getw (Stream)
FILE *Stream;描述
getc 宏返回下一个字节,作为从 Stream 参数指定的输入转换为 int 数据类型的 unsigned char 数据类型,并移动文件指针 (如果已定义)。 在 Stream 参数中提前一个字节。 当需要子例程时,不能使用 getc 宏; 例如,子例程指针不能指向它。
由于它是作为宏实现的,因此 getc 宏无法正确使用具有副作用的 Stream 参数值。 具体来说,以下情况不起作用:
getc(*f++)在这种情况下,使用 fgetc 子例程。
fgetc 子例程执行与 getc 宏相同的函数,但 fgetc 是一个真正的子例程,而不是一个宏。 fgetc 子例程运行速度比 getc 慢,但占用的磁盘空间少。
getchar 宏返回 stdin (标准输入流) 中的下一个字节。 getchar 宏等同于 getc (stdin)。
首次成功运行 fgetc, fgets, fgetwc, fgetws, fread, fscanf, getc, getchar get 或 scanf 子例程使用返回先前调用 ungetc 或 ungetwc 子例程未提供的数据的流来标记st_atime用于更新的字段。
getc 和 getchar 宏也已实现为用于 ANSI 兼容性的子例程。 要访问子例程而不是宏,请在源文件开头插入 #undef getc 或 #undef getchar 。
getw 子例程从 Stream 参数指定的输入返回下一个单词 (int) ,并增大关联的文件指针 (如果已定义) 以指向下一个单词。 一个词的大小因机器体系结构而异。 getw 子例程在文件末尾或发生错误时返回常量 EOF 。 由于 EOF 是有效整数值,因此应该使用 feof 和 ferror 子例程来检查 getw是否成功。 getw 子例程假定文件中没有特殊对齐。
由于从一个机器体系结构到另一个机器体系结构的字长和字节顺序的其他差异,使用 putw 子例程编写的文件依赖于机器,并且可能无法在不同类型的处理器上使用 getw 宏来读取。
参数
| 项 | 描述 |
|---|---|
| 流 | 指向打开文件的文件结构。 |
返回值
成功完成后, getc, fgetc, getchar, 而 getw 子例程从 Stream 参数所指向的输入流返回下一个字节或 int 数据类型。 如果流位于文件的末尾,那么将为流设置文件结束指示符,并返回整数常量 EOF 。 如果发生读错误,那么将设置 errno 全局变量以反映该错误,并返回值 EOF 。 应该使用 ferror 和 feof 子例程来区分文件末尾和错误情况。
错误代码
如果未对 Stream 参数指定的流进行缓冲,或者需要将数据读入流的缓冲区,那么 getc, getchar, fgetc, 或 getw 子例程在以下错误条件下失败:
| 项 | 描述 |
|---|---|
| 再次 | 指示为 Stream 参数指定的流的底层文件描述符设置了 O_NONBLOCK 标志。 该进程将在 fgetc 子例程操作中延迟。 |
| EBADF | 指示 Stream 参数指定的流下的文件描述符不是打开以进行读取的有效文件描述符。 |
| EFBIG | 指示尝试读取超出进程的文件大小限制或最大文件大小的文件。 请参阅 ulimit 子例程。 |
| EINTR | 指示由于接收到信号而终止了读操作,并且未传输任何数据,或者实现未报告此文件的部分传输。 注: 根据应用程序绑定到的库例程,此子例程可能返回 EINTR。 请参阅有关 sa_restart的 signal 子例程。
|
| EIO | 指示发生了物理错误,或者进程正在后台进程组中尝试从其控制终端执行 read 子例程调用,并且该进程正在忽略 (或阻塞) SIGTTIN 信号,或者该进程组是孤立的。 |
| EPIPE | 指示尝试从未打开以供任何进程读取的管道或先进先出 (FIFO) 进行读取。 还将向进程发送 SIGPIPE 信号。 |
| 溢出 | 指示该文件是常规文件,并且已尝试读取与相应流关联的最大偏移量或超出该偏移量。 |
在以下错误条件下, getc, getchar, fgetc或 getw 子例程也不成功:
| 项 | 描述 |
|---|---|
| ENOMEM | 指示存储空间不足。 |
| ENXIO | 指示对不存在的设备发出了请求,或者该请求超出了该设备的能力范围。 |