1、文件打开关闭

  1. 打开文件:fopen函数

    1. FILE * fopen(char *filename, char *mode);
    2. 1filename:要打开的文件名(路径)
    3. 2mode:文件打开模式
  2. 关闭文件:fclose函数

    2、文件读写

  3. fgetc:从文件指针所指向的文件中读取一字节数据,同时将读写位置指针向前移动一字节。

    1. int fgetc(FILE *filepointer);
  4. fputc:将形参c表示的字符数据输出到文件指针filepointer所指向的文件中,同时将读写位置指针向前移动一字节。

    1. int fputc(int c, FILE *filepointer);
  5. 读写实例: ```

    include

int main(int argc, char argv[]) { FILE fp1, *fp2; int ch; fp1 = fopen(“./test.txt”, “w”); if(!fp1){ return -1; } //写入文件 while (1){ ch = getchar(); if(ch == ‘@’) break; putc(ch, fp1); } fclose(fp1);

  1. fp2 = fopen("./test.txt", "r");
  2. if(!fp2){
  3. return -1;
  4. }
  5. //读取文件
  6. while ((ch = fgetc(fp2)) != EOF){
  7. printf("%c", ch);
  8. }
  9. fclose(fp2);
  10. return 0;

}

  1. <a name="wmrDv"></a>
  2. ## 3、读写字符串
  3. 1. fgets、fputs

//从文件中读取n个字节的数据 char fgets(char s, int n, FILE filepointer); //将s的数据传入文件 int fputs(char s, FILE *filepointer);

  1. ```
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. int main(int argc, char *argv[]) {
  5. FILE *fp1, *fp2;
  6. char str[] = "123456789";
  7. char *f1 = "./f1.txt", *f2 = "./f2.txt";
  8. fp1 = fopen("f1.txt", "w");
  9. if(fp1 == NULL){
  10. printf("can not open file :f1.txt\n");
  11. exit(0);
  12. }
  13. fputs(str, fp1);
  14. fputs("\nabcd", fp1);
  15. fclose(fp1);
  16. fp2 = fopen("f1.txt", "rt");
  17. fgets(str, 8, fp2);
  18. printf("%s\n", str);
  19. fgets(str, 8, fp2);
  20. printf("%s\n", str);
  21. fgets(str, 8, fp2);
  22. printf("%s\n", str);
  23. fclose(fp2);
  24. return 0;
  25. }
  26. //输出结果
  27. 1234567
  28. 89
  29. abcd

虽然读取的是8个字符,但是第二次遇到了\n,所以实际读取了3个字符。

4、数据块读写fread,fwrite

  1. fread

    1. unsigned fread(void *prt, unsigned size, unsigned n, FILE *filepointer);

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

  2. fwrite

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

    将ptr所指向的内存块数据(n个大小为size字节的数据项)写入到filepointer指向的文件中,实际要写入数据的字节数是n×size。同时将读写位置指针向前移动n×size字节。

  3. 示例代码: ```

    include

    include

    include

int main(int argc, char argv[]) { FILE fp; short i, a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

//调用fwrite将数组内容写入文件 //————————————————————————————————- fp = fopen(“f1.dat”, “wb”); if(fp == NULL){ printf(“can not create file: f1.dat\n”); exit(0); } fwrite(a, sizeof(short), 10, fp); fclose(fp);

  1. //调用fread读取二进制文件内容,写入数组

//————————————————————————————————- //数组数据清0 memset(a, 0, 10 * sizeof(short)); fp = fopen(“f1.dat”, “rb”); if(fp == NULL){ printf(“can not open file: f1.dat\n”); exit(0); } fread(a, sizeof(short), 10, fp); fclose(fp);

  1. for(i = 0; i < 10; i++){
  2. printf("%d\t", a[i]);
  3. }
  4. return 0;

}

  1. <a name="pNwkr"></a>
  2. ## 5、格式化读写函数
  3. 1. fscanf

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

  1. **从filepointer所指向的文件中读取数据**。除了多了一个文件指针的参数外,其它方面和scanf函数完全相同。
  2. 2. fprintf

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

  1. 将表达式**输出**到filepointer所指向的文件中。除了多个个文件指针的参数外,其它方面与printf完全相同。
  2. 3. 示例代码:

include

include

include

typedef struct { char no[9]; char name[10]; char sex; int age; char address[20]; }StudentInfo;

char *filename = “student.dat”;

int main(int argc, char argv[]) { FILE fp; char ch1[20], ch2[20]; fp = fopen(filename, “wt”); if(fp == NULL){ printf(“can not create file: %s\n”, filename); exit(0); }

  1. //输出到文件
  2. //------------------------------------------
  3. fprintf(fp, "%s %s", "zack", "atom");
  4. fclose(fp);
  5. fp = fopen(filename, "rt");
  6. if(fp == NULL){
  7. printf("can not open file: %s\n", filename);
  8. exit(0);
  9. }
  10. //从文件中读取
  11. //------------------------------------------
  12. fscanf(fp, "%s%s", ch1, ch2);
  13. printf("%s, %s", ch1, ch2);
  14. return 0;

}

```