目录
- getchar和putchar
- getc和putc
- fgetc和fputc
橙色
getchar和putchar
int getchar(void); // 从标准输入 stdin 获取一个字符(一个无符号字符)。这等同于 getc 带有 stdin 作为参数int putchar(int char); // 把参数 char 指定的字符(一个无符号字符)写入到标准输出 stdout 中。这等同于 putc 带有 stdout 作为参数
getc和putc
int getc(FILE *stream); // 从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动。 int putc(int char, FILE *stream); // 把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动。
fgetc和fputc
int fgetc(FILE *stream); // 从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动。
// 该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。int fputc(int char, FILE *stream); // 把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动。
// 如果没有发生错误,则返回被写入的字符。如果发生错误,则返回 EOF,并设置错误标识符。
getc
,putc
和fgetc
,fputc
的区别
两者的使用完全相同,只是实现不同。这里的f指的是function,而不是file。
getc,putc是通过宏定义实现,而fgetc,fputc是通过函数来实现。
宏只占用编译时间,不占用调用时间,而函数相反,因此内核的实现通常使用宏来定义函数,减少调用时间。
代码示例
需求:拷贝文件
./mycpy src dest
实现代码:
#include <stdio.h>
#include <stdlib.h>// 命令行传参
int main(int argc, char **argv) {FILE *fps, *fpd;int ch; // 存储读入的字符if(argc < 3) {fprintf(stderr, "Usage:%s <src_file> <dest_file>\n", argv[0]);exit(1);}fps = fopen(argv[1], "r");if(fps == NULL) {perror("fopen()");exit(1);}fpd = fopen(argv[2], "w");if(fpd == NULL) {fclose(fps);perror("fopen()");exit(1);}while(1) {ch = fgetc(fps);if(ch == EOF) { // 读到文件末尾结束循环break;}fputc(ch, fpd);}// 释放内存,后开的先关fclose(fpd);fclose(fps);exit(0);
}
使用:
./mycpy /usr/local/test /temp/out