C入门系列:第六章 文件输入输出

    xiaoxiao2023-12-03  154

    C入门系列:第一章 基本类型

    C入门系列:第二章 字符串

    C入门系列:第三章 函数

    C入门系列:第四章 数组和指针

    C入门系列:第五章 数据存储类别和内存管理

    C入门系列:第六章 文件输入/输出

    C入门系列:第七章 结构和其他数据形式

    C入门系列:第八章 C预处理器和C库

    文章目录

    1 文件2 getc()和putc()3 文件拷贝压缩4 fprintf()和fscanf()5 fgets()和fputs()6 fseek()和ftell()7 fgetpos()和fsetpos()8 ungetc()9 fflush()10 setvbuf()11 fread()和fwrite()12 feof()和ferror()

    1 文件

    fopen() 第1个参数为文件名,第二个参数为创建的文件开启的权限,返回 FILE* 指针,一般与 fclose() 配合使用,fclose()传入fopen()返回的文件指针。

    fopen()返回的文件指针并不指向实际的文件,它指向一个包含文件信息的数据对象,其中包含操作文件的I/O函数所用的缓冲区信息。

    fclose()返回整数值,返回0表示关闭成功,否则返回EOF失败。

    #include<stdio.h> #include<stdlib.h> // argc表示输入参数 // argv表示参数数据,argv[0]为终端输入的命令 int main(int argc, char *argv[]) { int ch; FILE *fp; // 文件指针 unsigned long count = 0; if (argc != 2) { printf("Usage:%s filename\n", argv[0]); exit(EXIT_FAILURE); } // fopen()创建一个文件 if ((fp = fopen(argv[1], "r")) == NULL) { printf("Can't open %s\n", argv[1]); exit(EXIT_FAILURE); } // 将输入写入文件,读取到文件结束符EOF=-1则结束 while ((ch = getc(fp)) != EOF) { putc(ch, stdout); count++; } // 关闭文件释放内存 fclose(fp); return 0; }

    2 getc()和putc()

    getc() 和 putc() 函数与 getchar() 与 putchar() 函数类似。所不同的是getc()和putc()要告诉函数使用哪一个文件。

    char ch; FILE *fp = fopen("test.txt", "r"); // 获取标注输入字符 ch = getchar(); ch = getc(fp); putc(ch, fpout); fclose(fp);

    3 文件拷贝压缩

    #include<stdio.h> #include<stdlib.h> #include<string.h> #define LEN 40 int main(int argc, char *argv[]) { FILE *in, *out; int ch; char name[LEN]; int count = 0; // 检查终端输入参数 if (argc < 2) { fprintf(stderr, "Usage:%s filename\n", argv[0]); exit(EXIT_FAILURE); } if ((in = fopen(argv[1], "r")) == NULL) { fprintf(stderr, "I couldn't open the file"); exit(EXIT_FAILURE); } strncpy(name, argv[1], LEN - 5); // 拷贝文件名 name[LEN - 5] = '\0'; // 设置空字符 strcat(name, ".red"); // 拼接字符串,文件名后添加.red if ((out = fopen(name, "w)) == NULL) { fprintf(stderr, "Can't create output file"); exit(3); } // 拷贝数据 while ((ch = getc(in)) != EOF) { if (count++ % 3 == 0) { putc(ch, out); // 打印3个字符中的第1个字符 } } // 关闭文件 if (fclose(in) != 0 || fclose(out) != 0) fprintf(stderr, "Error in cloing files"); return 0; }

    4 fprintf()和fscanf()

    fprintf() 和 scanf() 函数与 printf() 和 sanf() 类似,区别在于前者需要用第1个参数指定待处理的文件。

    rewind() 函数传入一个文件指针,将文件光标返回到开始位置,方便从头开始读取文件。

    #include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX 41 int main(void) { FILE *fp; char words[MAX]; if ((fp = fopen("wordy", "a+") == NULL) { fprintf(stdout, "Can't open file"); exit(EXIT_FAILURE); } puts("Enter words to add to the file; press the #"); puts("key at the beginning of a line to terminate"); // 将终端输入写入文件,输入'#'结束 while ((fscanf(stdin, "@s", words) == 1) && (words[0] != '#')) { fprintf(fp, "%s", words); } puts("File contents:"); rewind(fp); // 返回文件开始处 while (fscanf(fp, "%s", words) == 1) { puts(words); } if (fclose(fp) != 0) { fprintf(stderr, "Error closing file"); } return 0; }

    5 fgets()和fputs()

    fgets(buf, STLEN, fp);

    buf 是char类型数组的名称,STLEN 是字符串的大小,fp 文件指针。

    fgets() 函数读取输入直到第1个换行符的后面或读到文件结尾,或者读取STLEN-1个字符。fgets()在末尾添加一个空字符使之成为一个字符串,字符串的大小是其字符加上一个空字符。

    如果fgets()在读到字符上限之前已读完一整行,它会把表示行结尾的换行符放在空字符前面。

    fgets()函数在遇到EOF时将返回NULL,可以利用这一机制检查是否到达文件结尾;如果未遇到EOF则返回传给它的地址。

    fputs(buf, fp);

    buf 是字符串的地址,fp 用于指定目标文件。

    由于fgets()保留了换行符,fputs()就不会再添加换行符。

    6 fseek()和ftell()

    有了 fseek() 函数,便可以把文件看作是数组,在fopen()打开的文件中直接移动到任意字节处。fseek()返回int类型的值。

    ftell() 函数返回一个long类型的值,表示文件中的当前位置。

    // 倒叙显示文件的内容 #include<stdio.h> #include<stdlib.h> #define CNTL_Z '\032' #define SLEN 81 int main(void) { char file[SLEN]; char ch; FILE *fp; long count, last; puts("Enter the name of the file to be proccessed"); scanf("
    转载请注明原文地址: https://yun.8miu.com/read-114274.html
    最新回复(0)