C语言 第十一章 文件

文件的分类

按数据性质分类

程序文件、数据文件

按数据的编码方式

ASCII 文件、二进制文件

文件指针与文件内部指针

文件指针 FILE 应该是一个结构体类型,包含文件的各种信息,通过 fopen()赋值。
对文件操作时,文件内部也有一个指针,开始时指向最前面,每次读写该指针都会向后移动。

对文件的操作

  • 打开
  • 读写
  • 关闭

文件的打开与关闭

1
2
3
4
5
6
FILE * fp;
if((fp = fopen("d:\\a.txt",wb))==NULL)
{
printf("cannot open file strike any key exit");
exit(1);
}

用 fopen()函数打开文件,指针文件位置和打开方式。
打开方式包括:

  • rt 只读 ASCII 码文件
  • wt 只写 ASCII 码文件
  • at 追加 ASCII 码文件
  • rb 只读二进制文件
  • wb 只写二进制文件
  • ab 追加二进制文件
  • rt+ 以读的方式打开 ASCII 码文件,允许写入
  • wt+ 以写的方式打开 ASCII 码文件,允许读取
  • at+ 以追加的方式打开 ASCII 码文件,允许读写
  • rb+ 以读的方式打开二进制文件,允许写入
  • wb+ 以写的方式打开二进制文件,允许读取
  • ab+ 以追加的方式打开二进制文件,允许读写

文件的关闭

1
fclose(fp);

文件顺序读写

文件读写函数

  • 对 ASCII 码文件的读写
  • fgetc( ) 从文件中读取一个字符

    1
    2
    3
    4
    5
    6
    7
    ch = fgetc(fp);
    while(ch!=EOF)
    {
    putchar(ch);
    ch = fgetc(fp);
    }
    //使用 fgetc() 读取一个字符,只要读取到的不是 EOF 就继续读取。(EOF 是文件结束标志)
  • fputc( ) 向文件中写入一个字符

    1
    2
    3
    4
    5
    6
    7
    ch = getchar(); //从已经输入的字符串中读取一个字符
    while(ch != '\n')
    {
    fputc(ch, fp);
    ch = getchar();
    }
    //只要读取到的字符不是 '\n' 就往下读取
  • fgets( ) 从指定文件读取一个字符串放到字符数组

    1
    2
    fgets(str, 5, fp);
    //分别对应字符数组,要读取的字数个数,要读取的文件
  • fputs( )

    1
    2
    3
    4
    char st[20];
    scanf("%s", st); //从键盘输入字符串
    fputs(st, fp); //将字符串写入文件中
    //fputc 是每次写入一个字符,而 fgets 是写入一个字符串
  • 对二进制文件的读写

  • fwrite( ) 写数据块

    1
    2
    3
    4
    5
    6
    7
    fwrite(pp, sizeof(struct stu), 2, fp);
    /*
    pp 是结构体数组的首地址,这个位置放的是指针,表示存放输入数据的首地址。
    sizeof(struct stu) 是数据块的字节数
    2 表示要写入的数据块数量,这里的结构体数组有两个元素,所以是 2
    fp 是文件指针
    */
  • fread( ) 读数据块

    1
    2
    fread(qq, sizeof(struct stu), 2, fp);
    //含义与上面相似,qq 也是结构体类型数组。
  • 从文件中读写数据

注意:fscanf 是从文件往内存中发送数据,fprintf 是将内存数据写入文件中,这里是与直觉相反的

  • fprintf( )

    1
    2
    3
    4
    5
    6
    格式:
    fprintf(文件指针, 格式字符串, 输出表列);
    例子:
    fprintf(fp, "%s%d%d%s", pp->name, pp->num, pp->age, pp->addr);
    //pp 是一个结构体指针,pp->name 等指向了内存中的数据,这条语句是将这些数据写入到文件中。
    //注意格式字符串是有双引号的
  • fscanf( )

    1
    2
    3
    4
    5
    格式:
    fscanf(文件指针, 格式字符串, 输入表列);
    例子:
    fscanf(fp, "%s%d%d%s", qq->name, &qq->name, &qq->age, qq->addr);
    //qq 是结构体指针,qq->name 等是内存中存在的变量。需要注意的是,fscanf 会给内存中变量赋值,所以需要取变量地址

其他部分函数

1
2
feof(fp);
//判断文件是否结束,结束返回 1,否则返回 0;
1
2
rewind(fp);
//将内部指针指向开头,在对文件进行操作之后,想要读取数据就要重置内部指针