12.1 文件的打开与关闭

12.1.1 打开文件

FILE *fopen(char *filename, char *mode);

  • filename是一个字符串,表示要打开的文件名。文件名前可加上文件所在路径
  • mode字符串表示文件的打开方式。 | 打开文件的方式字符 | 含义 | | —- | —- | | r | read。打开一个已存在的文件读取数据,不能写数据。 | | w | write。创建一个新文件写入数据,不能读数据。如果文件已存在,则覆盖该文件。 | | a | append。打开一个存在的文件,在文件尾部追加数据,不能读数据。如果文件不存在,则创建这个文件写入数据。 | | r+ | 打开一个已存在的文件,可读可写。 | | w+ | 创建一个新文件,可读可写。若存在则覆盖。 | | a+ | 等价于a。但可以读取数据。 | | t | text。打开一个文本文件。 | | b | binary。打开一个二进制文件。 |

  • 打开失败则返回NULL

    1. //注意FILE为全部大写
    2. FILE *fp;
    3. fp=fopen("wang.txt", "r");
    4. if(fp==NULL)
    5. {
    6. printf("wang.txt not found");
    7. exit(-1);
    8. }
    9. //打开C盘bak目录下的文件
    10. fp=fopen("C:\\bak\\wang.dat", "wb");
  • 打开文件方式字符串mode可以采用符合形式,操作类型符在前,打开文件类型符在后。如“rb”,“wt”,不可颠倒。但是“+”,除了放在字符串开头,放哪都行。如“w+b”,“wb+”都可以,但“+wb“不行。

12.1.2 关闭文件

int *fclose(FILE *filepointer);

  • filepointer:文件指针,通常是fopen的返回值
  • 如果正常关闭了文件,返回0,否则返回非0
  • 文件打开读取和加工数据后,如果不关闭,可能会丢失数据!


12.1.3 feof函数

int feof(FILE *filepointer);

  • 用于判断文件是否结束;
  • 读取文件时,若遇到文件尾,则返回1;否则返回0;
  • 同时适用于ASCII码文件和二进制文件。从想从从从VB吧

    12.2 文件的读写

    12.2.1 字符读写函数fgetc和fputc

    int fgetc(FILE *filepointer);

  • 从filepointer指向的文件中读取一个字符(字节)的数据,同时将读写位置指针向前移动1个字节(即指向下一个字符)。

  • 读取正常,则返回读取到的字节值;若读取到文件尾或出错,则返回 EOF在头文件stdio.h中被定义为-1)。

int fputc(int c, FILE *filepointer);

  • 将c表示的字符数据输出到文件指针filepointer所指向的文件中,同时将读写位置指针向前移动1个字节(即指向下一个写入位置)。
  • 写入(输出)成功,则返回值就是写入(输出)的字符数据c,否则返回 EOF
  • int fputchar(char ch)会将ch标准输出流(stdout)中,并显示在屏幕。等价于fputc(c,stdout);

int feof(FILE *filepointer);

  • 遇到文件尾,返回1,否则返回0.
  • feof同时适用于ASCII码文件和二进制文件

12.2.2 字符串读写函数fgets和fputs

char *fgets(char *s, int n, FILE *filepointer);

  • 从指定文件中读取长度最大为n-1个字符的字符串,并在末尾加 '\0' ,然后将字符串存放到s中。同时将读写位置指针向前移动实际读取的字符串长度(≤n-1)个字节
  • 从文件中读取到第n-1个字符或遇到 '\n' 后,函数返回。 '\n' 也会被读取。
  • 操作成功,返回读取的字符串的指针;否则返回 NULL

int fputs(char *s, FILE *filepointer);

  • 将s表示的字符串写入文件中,同时将读写位置指针向前移动字符串长度个字节
  • fputs函数不会讲字符串结尾符 '\0' 写入文件,也不会自动向文件写入换行符,如果需要写入一行文本,s字符串中必须包含 '\n'
  • 操作成功,返回最后写入文件的字符值,否则返回 EOF

    12.2.3 数据块读写函数fread和fwrite

    可用来读写一组数据,如一个数组元素、一个结构变量的值等。
    unsigned fread (void *ptr, unsigned size, unsigned n, FILE *filepointer);

  • filepointer指向的文件中读取n个数据项,每个数据项的大小是size个字节,这些数据被存放到ptr所指向的内存中。同时,将读写位置指针向前移动n*size个字节。

  • 返回值:操作成功,返回读取的数据项的个数(不是字节的个数);操作错误或遇到文件尾,则返回0。

unsigned fwrite(void *ptr, unsigned size, unsigned n, FILE *filepointer);

  • ptr所指向的内存数据块(n个大小为size个字节的数据项)写入到filepointer指向的文件中。同时,将读写位置指针向前移动n*size个字节。
  • 返回值:操作成功,返回实际写入的数据项的个数(不是字节的个数);操作错误,则返回0。

fread和fwrite一般用于二进制文件的输入和输出。

12.2.4 格式化读写函数fscanf和fprintf

int fscanf (FILE *filepointer, const char *format[, address, ...]);

  • 从filepointer所指向的文件中读取数据。除了多了一个文件指针外,其他方面与scanf完全相同。
  • 操作成功,返回读取的数据项的个数;操作错误或遇到文件尾,返回EOF。

int fprintf (FILE *filepointer, const char *format[, address, ...]);.

  • 将表达式输出到filepointer所指向的文件。除了多了一个文件指针外,其他方面与printf完全相同。
  • 操作成功,返回写入到文件中数据的字节的个数;操作错误,返回EOF。

    1. fscanf(fp, "%d,%f", &i, &t); //若文件中有3, 4.5,则将3送入i, 4.5送入t
    2. fprintf(fp, "%d, %6.2f", i, t); //将i, t按指定格式输出到fp文件

    12.3 文件的定位读写

    12.3.1 rewind函数 (复位开头)

    void rewind(FILE *filepointer);

  • 将filepointer所指向的文件的读写位置指针重新置回到文件首部

    12.3.2 fseek函数 (定点移动)

    int fseek(FILE *filepointer, long offset, int whence);

  • 将filepointer所指向的文件的读写位置指针移动到特定位置;

  • 距离 whence 的 offset 字节处;
  • offset 为正,新的位置在whence 后; offset为负,新的位置在whence 前;
  • 操作成功返回0; 否则返回一个非0值。 | whence的常量值 | 数值 | 含义 | | —- | —- | —- | | SEEK_SET | 0 | 文件的开始处 | | SEEK_CUR | 1 | 文件位置指针的当前位置 | | SEEK_END | 2 | 文件的末尾 |

12.3.3 ftell函数 (返回当前)

long ftell(FILE *filepointer);

  • 返回 filepointer 所指向的文件的当前读写位置指针的值(用相对文件开头的位移量表示);
  • 操作成功,返回当前位置值; 否则返回 -1L