C语言常用IO函数

由于历史元素,C语言的IO函数很多,很容易混淆,在此总结一下。

一、文件复制

/**
 * Created by wangbin on 2022/1/11.
 * It works fine on linux but not on windows
 * fprintf和printf的区别是,printf是在向标准输出流stdout写数据,fprintf可以向它的第一个参数指定的流中写数据
 * scanf始终从标准输入流stdin读入数据,而fscanf从它的第一个参数所指定的流中读入数据
 * frepoen(const char *filename,const char *mode,FILE *fp)为一个打开的流附加一个文件,用于向文件追加数据
 * putchar()向标准输出流写一个字符
 * fputc()和putc()都是putchar()的更通用版本
 * getchar()从标准输入流读入一个字符
 * fgetc()和getc()从任意流读入字符
 * puts()想标准输出写入一个字符串,并加一个换行符
 * fputs()是puts()的更通用版本,可以向第二个参数指定的任意流写入一个字符串,不同在于fputs不会自动添加换行符
 * gets()从标准输入流读取一行,读到换行符为止,并抛弃换行符
 * fgets()从任意流读取信息,直到遇到换行符或参数指定的字符
 * fread、fwrite运行程序在单步中读写大的数据块
 *
*/

#include <stdlib.h>
#include <stdio.h>


int main(int argc, char *argv[]) {
    FILE *src_file, *dest_file;
    int ch;
    if (argc != 3) {
        fprintf((FILE *) stderr, "usage fcopy source_file dest_file\n");
        printf("usage fcopy source_file dest_file");
        exit(EXIT_FAILURE);
    }
    if ((src_file = fopen(argv[1], "r")) == NULL) {
        fprintf((FILE *) stderr, "cannot open %s\n", argv[1]);
        printf("cannot open %s\n", argv[1]);
        exit(EXIT_FAILURE);
    }
    if ((dest_file = fopen(argv[2], "a")) == NULL) {
        fprintf((FILE *) stderr, "cannot open %s\n", argv[2]);
        printf("cannot open %s\n", argv[2]);
        fclose(src_file);
        exit(EXIT_FAILURE);
    }
    while ((ch = getc(src_file)) != EOF) {
        putc(ch, dest_file);
    }
    printf("success!");
    fclose(src_file);
    fclose(dest_file);

    return 0;
}

二、文件块读写

/**
 * Created by wangbin on 2022/1/13.
 * Modifies a file of part records by setting quantity on_hand to zero for all records
 * fread、fwrite运行程序在单步中读写大的数据块
*/

#include <stdio.h>
#include <stdlib.h>

#define NAME_LEN 5
#define MAX_PARTS 10

struct part {
    int number;
    char name[NAME_LEN + 1];
    int on_hand;
} inventory[MAX_PARTS];

int num_parts;

int main(void) {
    FILE *fp;
    int i;
    if ((fp = fopen("invent.dat", "rb+")) == NULL) {
        fprintf(stderr, "Can't open inventory file\n");
        exit(EXIT_FAILURE);
    }
    //把文件内容读入数组。参数1:数组名;参数2:数组元素大小;参数3:数组元素数量;参数4:文件指针
    num_parts = fread(inventory, sizeof(struct part), MAX_PARTS, fp);
    for (i = 0; i < num_parts; i++) {
        inventory[i].on_hand = 0;
    }
    //将文件指针重新指导文件起始处
    rewind(fp);
    //参数1:数组地址;参数2:数组元素大小;参数3:要写的元素数量;参数4:文件指针
    fwrite(inventory, sizeof(struct part), num_parts, fp);
    fclose(fp);
    return 0;
}

 

posted @ 2022-01-13 16:35  Mars.wang  阅读(221)  评论(0编辑  收藏  举报