1、ASCII文件、二进制文件

image.png

  • ASCII文件:每个字节放在一个ASCII中
  • 二进制文件:把内存中的数据储存样式原样输出到磁盘上

2、相关操作

fopen

  • r
    • 打开一个已有的文本文件,允许读取文件
  • w
    • 打开一个文本文件,允许写入文件
    • 如果文件不存在,则会创建一个新文件。
    • 如果文件存在,则该会被截断为零长度,重新写入
  • a
    • 打开一个文本文件,以追加模式写入文件。
    • 如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容
  • r+
    • 打开一个文本文件,允许读写文件。
  • w+
    • 打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件
  • a+
    • 打开一个文本文件,允许读写文件。
    • 如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。
      1. // 出错返回NULL
      2. FILE *fp = fopen("a.txt", "r");

fgetc/fputc

  • 读取写入字符

    fgets/fputs

  • 写入

      FILE *fp;
    
      //判断文件是否打开失败
      if ( (fp = fopen("/Users/wangchun/Desktop/a.txt", "w+")) == NULL ) {
          puts("Fail to open file!");
          return -1;
      }
    
      // 写入字符串
      fputs("hello", fp);
    
      // 写入一个字符
      char a = 'a';
      fputc(a, fp);
    
  • 读取

      FILE *fp;
    
      //判断文件是否打开失败
      if ( (fp = fopen("/Users/wangchun/Desktop/a.txt", "r+")) == NULL ) {
          puts("Fail to open file!");
          return -1;
      }
    
      char ch = fgetc(fp);
    
      //循环读取文件的每一行数据
      while( ch != EOF ) {
          printf("%c", ch);
          ch = fgetc(fp);
      }
    
      //操作结束后关闭文件
      fclose(fp);
    

    rewind(fp)

  • 将文件指针重新定义到开头处

    fclose

  • 关闭成功返回0

  • 失败返回EOF(-1)

    fread/fwrite

  • 文件中储存、读取结构体列表 ```

    include

    include

    define SIZE 3

struct student { char name[10]; int age; }stu[SIZE];

int main(void) {

for (int i = 0; i < SIZE; i++) {
    stu[i].age = i;
    strcpy(stu[i].name, "name");
}

FILE *fp;
//判断文件是否打开失败
if ( (fp = fopen("/Users/wangchun/Desktop/a.txt", "r+")) == NULL ) {
    puts("Fail to open file!");
    return -1;
}

// 写入结构体
for (int i = 0; i < SIZE; i++) {
    fwrite(&stu[i], sizeof(struct student), 1, fp);
}

// fp重新开始
rewind(fp);

// 读取结构体
struct student s1;
for (int i = 0; i < SIZE; i++) {
    fread(&s1,sizeof(struct student), 1, fp);
    printf("%d\n",s1.age);
    printf("%s\n",s1.name);
}

//操作结束后关闭文件
fclose(fp);

return 0;

}

<a name="FfJWS"></a>
#### fscanf/fprintf
<a name="4FVX1"></a>
#### fseek

- 改变文件的指针位置
> fseek(文件指针类型,位移量,起始点);

- 起始点有三种类型
> #define SEEK_SET 0  // 文件开头
> #define SEEK_CUR 1  // 当前位置
> #define SEEK_END 2  // 尾椎末尾

- 代码
FILE *fp;
//判断文件是否打开失败
if ( (fp = fopen("/Users/wangchun/Desktop/a.txt", "w+")) == NULL ) {
    puts("Fail to open file!");
    return -1;
}

fputs("01234", fp);

char a;

// 指向位置0
rewind(fp);

// 指向位置0
fseek(fp, 0, SEEK_SET);
a = fgetc(fp);
printf("%c",a);//0

// 指向位置1
fseek(fp, 1, SEEK_SET);
a = fgetc(fp);
printf("%c",a);//1

// 指向位置2
fseek(fp, 0, SEEK_CUR);
a = fgetc(fp);
printf("%c",a);//2

// 指向位置3
fseek(fp, 0, SEEK_CUR);
a = fgetc(fp);
printf("%c",a);//3

// 指向位置4
fseek(fp, -1, SEEK_END);
a = fgetc(fp);
printf("%c",a);//3

//操作结束后关闭文件
fclose(fp);
<a name="OJ4gv"></a>
#### ftell

- 返回当前位置
FILE *fp;
if ( (fp = fopen("/Users/wangchun/Desktop/a.txt", "w+")) == NULL ) {
    puts("Fail to open file!");
    return -1;
}

fputs("01234", fp);

fseek(fp, 0, SEEK_SET);
//加一个结束符,总长度6
printf("%d",ftell(fp));// 0

fseek(fp, 0, SEEK_END);
//加一个结束符,总长度6,所以位置是5
printf("%d",ftell(fp));// 5

fclose(fp);

```

feof

  • 判断是否到文件末尾,0表示未到末尾

    int end = feof(fp);

ferror

  • 错误的话该函数返回一个非零值,否则返回一个零值

    clearerr

  • 使ferror函数返回值为零