橙色
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