文件操作

文件操作

什么是文件

  1. image-20221111215431353
  2. 数据文件
    • 存放程序运行时需要读取的数据
  3. 文件名
    • 文件名包含:文件路径+文件主干+文件后缀
    • image-20221111215955712

文件的打开和关闭

  1. 文件指针:指向文件地址
  2. 文件信息区:在内存中开辟的名为FILE的结构体变量(由系统声明)
  3. 通过使用FILE*指针来维护FILE结构体
  4. fopen()函数和:
  5. image-20221111221754676

filename:文件名

mode:打开方式

fopen:打开文件

fclose :关闭文件

  1. 打开文件的方式

文件的读写与关闭

  1. 相关函数:

    • image-20221112084625654
  2. 输入:指从内存中写入到硬盘

  3. 输出:指从硬盘读取到内存中

  4. perror():C 库函数 void perror(const char \*str) 把一个描述性错误消息输出到标准错误 stderr。首先输出字符串 str,后跟一个冒号,然后是一个空格。

    1
    2
    3
    4
    5
    6
    FILE* pr=fopen("chg.tet","r");
    if(pr==NULL)
    {
    perror("fopen");
    return 1;
    }

    image-20221112091903125

  5. fputc('char',流的指针):写一个数据到流里面去

  6. fgetc:当文件读取正常,返回的是字符的ASCLL码值是个整形,读取错误(读取完成)则返回的是EOF(-1)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    int main()
    {
    FILE* pr;
    int ret;
    //打开文件
    pr=fopen("chg.tet","r+");
    //文件的判断
    if(pr==NULL)
    {
    perror("fopen:");
    return 1;
    }
    //文件写入
    fputs("c",pr);
    //文件读取
    rewind(pr);
    ret=fgetc(pr);
    printf("%c",ret);
    //关闭文件
    fclose(pr);
    return 0;
    }
  7. fputs:写一个字符串

    • fputs("chg,tsy\n",pr);
      
      1
      2
      3
      4
      5
      6
      7



      8. `fgets`:读一个字符串

      - ```c
      fgets(arr,4,pr);
    • int main()
      {
          FILE* pr=NULL;
          char arr[10];
          //文件的创建
          pr=fopen("chg.tet","r+");
          //文件的判断
          if(pr==NULL)
          {
              perror("fopen:");
              return 1;
          }
          //第一次文件操作
          fputs("chgchg",pr);
          rewind(pr);
          fgets(arr,7,pr);
          printf("%s\n",arr);
          //第二次文件操作
          rewind(pr);
          fputs("tsytsy",pr);
          rewind(pr);
          fgets(arr,7,pr);
          printf("%s\n",arr);
          //文件的关闭
          fclose(pr);
      
          return 0;
      }
      
      
      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

      ## 结构体数据存储

      1. `fprintf()`:

      ```c
      int main()
      {
      //创建文件
      FILE* pr = NULL;
      pr = fopen("chg.txt", "r+");

      stu stu1;
      scanf("%s%s", stu1.number, stu1.name);
      //文件的判断
      if (pr == NULL)
      {
      perror("fopen:");
      return 1;
      }
      //文件的写入
      fprintf(pr, "number:%s\tname:%s", stu1.number, stu1.name);
      rewind(pr);
      //关闭文件
      fclose(pr);
      return 0;
      }
  8. fscanf():成功返回1

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
int main()
{
//创建文件
FILE* pr = NULL;
pr = fopen("chg.txt", "r+");

stu stu1 = { 0 };
scanf("%s%s", stu1.number, stu1.name);
//文件的判断
if (pr == NULL)
{
perror("fopen:");
return 1;
}
//文件的写入
fprintf(pr, "number:%s\tname:%s", stu1.number, stu1.name);
//文件的读取
rewind(pr);
stu1.number[1] = "123";
stu1.name[0] = "00000";
fscanf(pr, "number:%s\tname:%s", &stu1.number,&stu1.name);
printf("number:%s\tname:%s", stu1.number, stu1.name);
//关闭文件
fclose(pr);
pr = NULL;
return 0;
}

二进制写入:

  1. fwrite:将buffer的东西存储进流里面image-20221113114946926
  • buffer是个指针,地址

  • size:元素的大小,单位是字节

  • count:元素个数

  • 最后为流地址

  • 
    typedef struct student
    {
        char number[20];
        char name[10];
    }stu;
    
    int main()
    {
        //文件的创建
        FILE* pr = NULL;
        pr = fopen("chg.txt", "r+");
        stu stu1;
        scanf("%s%s", stu1.name, stu1.number);
        //文件的2进制读写
        fwrite(&stu1, sizeof(stu), 1, pr);
    
        //文件的关闭
        fclose(pr);
        pr = NULL;
        return 0;
    }
    
    
    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



    2. `fread`:将流里面的东西读出来![image-20221113130044448](C:\Users\12414\Desktop\C语言笔记\文件操作\文件操作.assets\image-20221113130044448.png)

    ```c
    typedef struct student
    {
    char number[20];
    char name[10];
    }stu;

    int main()
    {
    //文件的创建
    FILE* pr = NULL;
    pr = fopen("chg.txt", "r+");
    stu stu1;
    //文件的2进制读写
    fread(&stu1,sizeof(stu1),1,pr);
    printf("%s\n%s", stu1.name, stu1.number);
    //文件的关闭
    fclose(pr);
    pr = NULL;
    return 0;
    }

  1. 判断文件的读取是否成功

    1
    feof("文件指针");//读取成功返回0,不成功返回非零值

fseek

  1. 移动文件内部的指针,达到随机访问的目的

  2. 实例:

    1
    2
    3
    4
    5
    #include<stdio.h>

    int main()
    {
    }

注意事项

  1. 遵循顺序:创建文件,文件的判断,文件的写入,文件的读取,文件的关闭,记得让指针只向空,文件写入后记得让指针恢复,再进行

文件操作
https://tsy244.github.io/2023/04/20/C/文件操作/
Author
August Rosenberg
Posted on
April 20, 2023
Licensed under