fgetc函数和fputc函数

目录

  • 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,并设置错误标识符。

getcputcfgetcfputc的区别

两者的使用完全相同,只是实现不同。这里的f指的是function,而不是file。

getc,putc是通过宏定义实现,而fgetc,fputc是通过函数来实现。

宏只占用编译时间,不占用调用时间,而函数相反,因此内核的实现通常使用宏来定义函数,减少调用时间。

代码示例
需求:拷贝文件

./mycpy src dest

实现代码:

#include 
#include 

// 命令行传参
int main(int argc, char **argv) {

    FILE *fps, *fpd;
    int ch; // 存储读入的字符

    if(argc < 3) {
        fprintf(stderr, "Usage:%s  \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

你可能感兴趣的:(#,Linux系统编程入门,linux)