由于历史元素,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; }