putc , putchar , fputc 或 putw 子例程
用途
将字符或字写入流。
库
标准 I/O 软件包 (libc.a)
语法
描述
putc 和 putchar 宏将字符或字写入流。 fputc 和 putw 子例程具有类似的用途,但它们是真正的子例程。
putc 宏将字符 Character (转换为 unsigned char 数据类型) 写入 Stream 参数指定的输出。 在文件指针指向的位置写入字符 (如果已定义)。
putchar 宏与 putc 宏相同,但 putchar 写入标准输出。
fputc 子例程的工作方式与 putc 宏相同,但 fputc 是真正的子例程,而不是宏。 它的运行速度比 putc, 慢,但每次调用占用的空间更少。
由于 putc 是作为宏实现的,因此它错误地处理了具有副作用的 Stream 参数,例如 putc(C,
*f++)。 对于此类情况,请改为使用 fputc 子例程。 此外,只要需要将指向此子例程的指针作为参数传递到另一个子例程,请使用 fputc 。
putc 和 putchar 宏也已实现为用于 ANSI 兼容性的子例程。 要访问子例程而不是宏,请在源文件开头插入 #undef putc 或 #undef putchar 。
putw 子例程将 Word 参数指定的字 (int 数据类型) 写入 Stream 参数指定的输出。 该字写在文件指针 (如果定义) 指向的位置。 单词的大小是整数的大小,因机器而异。 putw 子例程不会假定或导致文件中数据的特殊对齐。
在 fputcw, putwc, fputc, putc, fputs, puts或 putw 子例程成功运行之后,在下一次成功完成对同一流上的 fflush 或 fclose 子例程或对 exit 或 abort 子例程的调用之前,会将文件的 st_ctime 和 st_mtime 字段标记为更新。
由于字长和字节顺序可能存在差异,因此使用 putw 子例程编写的文件依赖于机器,并且可能无法在不同的处理器上使用 getw 子例程进行读取。
缺省情况下,除了 stderr之外,输出流在引用文件时进行缓冲,如果它们引用终端时进行行缓冲。 缺省情况下,未对标准错误输出流 stderr进行缓冲,但使用 freopen 子例程会使其变为缓冲或行缓冲。 使用 setbuf 子例程来更改流缓冲策略。
当输出流未缓冲时,将在写入目标文件或终端时对信息进行排队以进行写入。 缓冲输出流时,会将许多字符保存并写入为块。 当对输出流进行行缓冲时,当行完成时 (即,只要写入换行符或请求终端输入) ,输出的每一行都将排队以在目标终端上写入。
参数
| 项 | 描述 |
|---|---|
| 流 | 指向打开文件的文件结构。 |
| 字符 | 指定要写入的字符。 |
| 单词 | 指定要写入的字 (不可移植,因为字长和字节排序与机器相关)。 |
返回值
成功完成后,这些函数将返回所写入的值。 如果这些函数失败,那么它们将返回常量 EOF。 如果未打开 Stream 参数进行写入,或者如果无法增大输出文件大小,那么它们将失败。 由于 EOF 值是有效整数,因此您应该使用 ferror 子例程来检测 putw 错误。
错误代码
如果未缓冲 Stream 或需要清空 Stream 缓冲区,那么 fputc 子例程将失败,并且:
| 项 | 描述 |
|---|---|
EAGAIN |
为 流 底层的文件描述符设置了 O_NONBLOCK 标志,该进程将在写操作中延迟。 |
EBADF |
流 底层的文件描述符不是打开以进行写入的有效文件描述符。 |
EFBIG |
尝试写入的文件超过进程限制的文件大小或最大文件大小。 |
EFBIG |
该文件是常规文件,尝试在最大偏移量或超出最大偏移量时写入。 |
EINTR |
由于接收到信号,写操作已终止,并且未传输任何数据,或者实现未报告此文件的部分传输。 |
EIO |
发生了物理 I/O 错误,或者进程是试图对其控制终端执行 write 子例程的后台进程组的成员,设置了 TOSTOP 标志。 进程既不会忽略也不会阻止 SIGTTOU 信号,并且进程的进程组是孤立的。 在依赖于实现的条件下也可能返回此错误。 |
ENOSPC |
包含该文件的设备上没有剩余可用空间。 |
EPIPE |
尝试写入未打开以供任何进程读取的管道或先进先出 (FIFO)。 还将向进程发送 SIGPIPE 信号。 |
在下列情况下, fputc 子例程可能会失败:
| 项 | 描述 |
|---|---|
ENOMEM |
存储空间不足。 |
ENXIO |
对不存在的设备发出了请求,或者该请求超出了该设备的能力范围。 |