C语言 - 文件操作

C程序中,对于文件中数据的输入/输出操作以“流(stream)” 的方式进行,可以看做是一种数据的流动。

输入流和输出流

  1. 输入流:数据从数据源(比如:文件)到程序(或内存)的流动过程。

  2. 输出流:数据从程序(或内存)到数据源(比如:文件)的流动过程。

    输入输出流

C语言文件的读写:

  1. 创建/打开文件:

    1. 使用 fopen() 函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型 FILE 的一个对象,类型 FILE 包含了所有用来控制流的必要的信息。

    2. 函数原型:FILE *fopen( const char * filename e, const char * mode );

    3. 说明:在这里,filename是字符串,用来命名文件;访问模式mode的值可以是下列值中的一个。

      模式1

      模式2

      **技巧:**这些访问模式字符串可以根据需要进行组合使用。例如,”r+” 表示读写,”r+b” 表示读写(二进制)。

      **注意:**如果处理的是二进制文件(图片,视频..),则需使用下面的访问模式: “rb”, “wb”, “ab”, “rb+”, “r+b”, “wb+”, “w+b”, “ab+”, “a+b” 。

  2. 关闭文件:

    1. 使用完文件后(读,写),一定要将该文件关闭。
    2. 关闭文件,使用fclose( ) 函数。
    3. 函数原型:int fclose( FILE *fp );
    4. 如果成功关闭文件,fclose( ) 函数返回零。此时,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存。
    5. 如果关闭文件时发生错误,函数返回 EOF。EOF 是一个定义在头文件 stdio.h 中的常量。
  3. 写入文件:

    1. C 标准库提供了各种函数来按字符或者以固定长度字符串的形式读/写文件。
    2. **fputc()**函数:
      1. 函数原型:int fputc( int c, FILE *fp );
      2. **说明:**函数 fputc() 把参数c 的字符值写入到fp 所指向的输出流中。如果写入成功, 它会返回写入的字符,如果发生错误,则会返回 EOF。
    3. **fputs()**函数:
      1. 函数原型:int fputs( const char *s, FILE *fp );
      2. 说明:函数fputs() 字符串 s 写入到 fp 所指向的输出流中。如果写入成功,它会返回一个非负值,如果发生错误,则会返回 EOF。
    4. **fprintf()**函数:
      1. 函数原型:int fprintf(FILE *fp,cons t char *format, …);
      2. 功能与fputs()类似,将一个字符串写入到文件中。
  4. 举例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include <stdio.h>
    int main() {
    //创建一个文件指针
    FILE *fp = NULL;

    //打开该文件
    fp = fopen("d:/hello.txt", "w+"); //w+模式是:如果文件已存在,则截断文件为零长度。
    //fp = fopen("d:/hello.txt", "a+"); //a+模式是:如果文件已存在,则将写入的数据追加到文件末尾。

    //将内容写入到文件中
    fputs("你好,北京!!\n", fp);
    fprintf(fp, "你好,世界!!\n");

    //关闭文件!如果不关闭 ,我们的内容没有保存到文件中!
    fclose(fp);

    printf("创建,写入信息完成");

    return 0;
    }
  5. 读取文件:

    1. **fgetc()**函数:
      1. 函数原型:int fgetc( FILE * fp );
      2. 说明:fgetc() 函数从fp 所指向的输入文件中读取一个字符。返回值是读取的字符, 如果发生错误则返回 EOF。
    2. **fscanf()**函数:
      1. 函数原型:int fscanf(FILE *fp, const char *format, …)
      2. 说明:
      3. 使用 fscanf() 函数从文件中读取格式化的数据,比如整数、浮点数等各种类型的数据format 参数指定了数据的格式,后面的参数是用于存储读取数据的变量。
      4. 如果使用 fscanf() 函数从文件中读取字符串,会在遇到第一个空白字符(空格、制表符、换行符等)时,停止读取,之后的内容会被忽略。
      5. 如果函数成功读取了一些数据并按照指定格式存储到相应的变量中,它会返回成功读取的参数个数。或者在读取失败或文件结束时返回 EOF。
    3. **fgets()**函数:
      1. 函数原型:char *fgets( char *buf, int n, FILE *fp );
      2. 说明:
      3. 此函数按行读取数据,它从文件中读取一行数据(包括换行符 ‘\n’),并将这一行的内容存储到指定的缓冲区中。参数中 buf 是用于存储读取的文本的缓冲区,n 是缓冲区的大小,fp 是文件指针。
      4. 如果成功读取,返回参数 buf,即读取到的字符串的首地址。如果到达文件末尾或者读取失败,返回NULL。
  6. 举例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #include <stdio.h>

    int main() {

    //创建一个文件指针
    FILE *fp = NULL;
    //定义一个缓冲区
    char buff[1024];

    //打开文件
    fp = fopen("d:/hell.txt", "r");
    //方法1
    fscanf(fp, "%s", buff);
    ////输出
    printf("%s\n", buff);

    //方法2 读取整个文件
    //说明,循环读取fp指向的文件内容,如果读到NULL,就结束

    while (fgets(buff, 1024, fp) != NULL) {
    printf("%s", buff);
    }

    //关闭文件
    fclose(fp);

    return 0;
    }
  7. fwritefread

    读写1

    读写2

    读写3

参考链接: