[关闭]
@SuHongjun 2020-05-07T07:31:30.000000Z 字数 5438 阅读 139

C语言-Day 19 - 文件操作1

C语言 未分类


文件操作4部曲

文件操作示例:

  1. #include "stdio.h"
  2. main()
  3. {
  4. FILE *fp; //定义文件指针
  5. //struct _iobuf *fp2;
  6. fp = fopen("H.txt","w"); //打开文件
  7. fprintf(fp,"Hello world!\n"); //对文件进行读、写
  8. fclose(fp); //关闭文件
  9. }
  10. /*
  11. 文件操作4部曲:
  12. 定义文件指针
  13. 打开文件
  14. 对文件进行读、写
  15. 关闭文件
  16. */

文件指针

  1. struct _iobuf {
  2. char *_ptr;
  3. int _cnt;
  4. char *_base;
  5. int _flag;
  6. int _file;
  7. int _charbuf;
  8. int _bufsiz;
  9. char *_tmpfname;
  10. };
  11. typedef struct _iobuf FILE;

fopen() 函数

fopen() 函数的打开方式:FILE *fopen(char *filename, char *mode);
filename为文件名(包括文件路径),mode为打开方式,它们都是字符串。
整体来说,文件打开方式由 r、w、a、+、t、b 六个字符拼成

  1. rwa、+表示读写权限:
  2. r: read,读
  3. w: write,写
  4. a: append,追加
  5. +: 读和写
  1. tb表示读写方式:
  2. t: text,文本文件,读写方式的默认值
  3. b: binary,二进制文件

读写权限和读写方式可以组合使用,组合方式为以下2种方式之一:

调用 fopen() 函数时必须指明读写权限,但是可以不指明读写方式(此时默认为"t")。

控制读写权限的字符串(必须指明):

打开方式 说明
"r" 以“只读”方式打开文件。只允许读取,不允许写入。文件必须存在,否则打开失败。
"w" 以“写入”方式打开文件。如果文件不存在,那么创建一个新文件;如果文件存在,那么清空文件内容(相当于删除原文件,再创建一个新文件)。
"a" 以“追加”方式打开文件。如果文件不存在,那么创建一个新文件;如果文件存在,那么将写入的数据追加到文件的末尾(文件原有的内容保留)。
"r+" 以“读写”方式打开文件。既可以读取也可以写入,也就是随意更新文件。文件必须存在,否则打开失败。
"w+" 以“写入/更新”方式打开文件,相当于w和r+叠加的效果。既可以读取也可以写入,也就是随意更新文件。如果文件不存在,那么创建一个新文件;如果文件存在,那么清空文件内容(相当于删除原文件,再创建一个新文件)。
"a+" 以“追加/更新”方式打开文件,相当于a和r+叠加的效果。既可以读取也可以写入,也就是随意更新文件。如果文件不存在,那么创建一个新文件;如果文件存在,那么将写入的数据追加到文件的末尾(文件原有的内容保留)。

控制读写方式的字符串(可以不写):

打开方式 说明
"t" 文本文件。如果不写,默认为"t"。
"b" 二进制文件。

文本文件读写

写:fprintf()、fputs(),fgetc()
读:fscanf()、fgets(),fgetc()
判断是否到文件末尾:feof()

各函数的原型:

  1. //int feof(FILE *fp); //【返回值】检测到文件结束标识返回1,否则返回0。
  2. 格式化读写文件:
  3. //int fscanf ( FILE *fp, char * format, ... );
  4. //int fprintf ( FILE *fp, char * format, ... );
  5. 以字符串的形式读写文件:
  6. //char *fgets ( char *str, int size, FILE *fp );
  7. //int fputs( char *str, FILE *fp );
  8. 以字符形式读写文件:
  9. //int fgetc(FILE *fp);
  10. int fputc ( int ch, FILE *fp );

应用实例:

  1. #include "stdio.h"
  2. main()
  3. {
  4. FILE *fp;
  5. char buf[300];
  6. int readCount;
  7. fp = fopen("格式化读写文件.txt","wt");
  8. fprintf(fp,"格式化读写文件:\n");
  9. fprintf(fp,"//int fscanf ( FILE *fp, char * format, ... );\n");
  10. fprintf(fp,"//int fprintf ( FILE *fp, char * format, ... );\n");
  11. fclose(fp);
  12. fp = fopen("格式化读写文件.txt","rt");
  13. readCount = fscanf(fp,"%s",buf);
  14. printf("%s\n",buf);
  15. readCount = fscanf(fp,"%s",buf);
  16. printf("%s\n",buf);
  17. readCount = fscanf(fp,"%s",buf);
  18. printf("%s\n",buf);
  19. //fscanf()读入并显示的内容和fprintf()输出的内容并不一致
  20. }
  1. /*
  2. 以字符串的形式读写文件:
  3. char *fgets ( char *str, int size, FILE *fp );
  4. int fputs( char *str, FILE *fp );
  5. */
  6. #include "stdio.h"
  7. main()
  8. {
  9. FILE *fp;
  10. char buf[300];
  11. int readCount;
  12. fp = fopen("以字符串的形式读写文件.txt","wt");
  13. fputs("格式化读写文件:\n",fp); //fputs()并不会自动附加换行符
  14. fputs("char *fgets ( char *str, int size, FILE *fp );\n",fp);
  15. fputs("int fputs( char *str, FILE *fp );\n",fp);
  16. fclose(fp);
  17. fp = fopen("以字符串的形式读写文件.txt","rt");
  18. fgets(buf,300,fp);
  19. printf("%s",buf);
  20. fgets(buf,300,fp);
  21. printf("%s",buf);
  22. fgets(buf,300,fp);
  23. printf("%s",buf);
  24. }
  1. //写
  2. #include "stdio.h"
  3. main()
  4. {
  5. FILE *fp; //定义文件指针
  6. fp = fopen("Hello.txt","w"); //打开文件
  7. fprintf(fp,"===================================\n"); //对文件进行读、写
  8. fprintf(fp,"Hello world!\n"); //对文件进行读、写
  9. fprintf(fp,"===================================\n"); //对文件进行读、写
  10. fprintf(fp,"欢迎来昆明做客!\n"); //对文件进行读、写
  11. fclose(fp); //关闭文件
  12. }
  1. #include "stdio.h"
  2. main()
  3. {
  4. FILE *fp;
  5. char buf[200];
  6. fp = fopen("Hello.txt","r");
  7. while(!feof(fp))
  8. {
  9. fgets(buf,200,fp); //char *fgets(char *s, int size, FILE *stream);
  10. puts(buf);
  11. }
  12. fclose(fp);
  13. }
  1. #include "stdio.h"
  2. main()
  3. {
  4. FILE *fp;
  5. char buf[200], c;
  6. fp = fopen("Hello.txt","r");
  7. while(!feof(fp))
  8. {
  9. fscanf(fp,"%s",buf); //int fscanf(FILE *stream, char *format,[argument]);
  10. printf("%s\n",buf);
  11. }
  12. fclose(fp);
  13. }
  1. #include "stdio.h"
  2. main()
  3. {
  4. FILE *fp;
  5. char buf[200], c;
  6. fp = fopen("Hello.txt","r");
  7. if( fp != NULL )
  8. {
  9. while( (c = fgetc(fp)) != EOF ) //int fgetc(FILE * stream);
  10. putchar(c);
  11. }
  12. printf("\n");
  13. fclose(fp);
  14. }

二进制文件读写

.............

文件读写实例:

  1. #include "stdio.h"
  2. struct BOOK //结构体类型定义,BOOK是类型名,定义的新类型是:struct BOOK类型
  3. {
  4. char ISBN[50]; //结构体的成员
  5. char bookName[100];
  6. char author[100];
  7. float price;
  8. int soldCount;
  9. };
  10. void InputBookInfo(struct BOOK *b);
  11. void outPutToScreen(struct BOOK *b);
  12. void outPutToTxt(struct BOOK *b);
  13. void outPutToDB(struct BOOK *b);
  14. void GetBookInfoFromDB(struct BOOK *b);
  15. main()
  16. {
  17. struct BOOK b[100]; //b是一个结构体数组,数组元素的类型是:struct BOOK
  18. GetBookInfoFromDB(b);
  19. //InputBookInfo(b);
  20. outPutToScreen(b);
  21. //outPutToTxt(b);
  22. //outPutToDB(b);
  23. }
  24. void GetBookInfoFromDB(struct BOOK *b)
  25. {
  26. FILE *fp;
  27. int i;
  28. fp = fopen("books.db","rb");
  29. fread(b,sizeof(struct BOOK) *3,1,fp);
  30. fclose(fp);
  31. }
  32. void InputBookInfo(struct BOOK *b)
  33. {
  34. int i;
  35. char buff[100];
  36. printf("请录入图书信息:\n");
  37. for(i=0; i<3; i++)
  38. {
  39. printf("第%d本书--ISBN:",i+1);
  40. gets(b[i].ISBN); //b[i].ISBN 是数组名
  41. printf("第%d本书--书名:",i+1);
  42. gets(b[i].bookName); //b[i].bookName 是数组名
  43. printf("第%d本书--作者:",i+1);
  44. gets(b[i].author); //b[i].author 是数组名
  45. printf("第%d本书--售价:",i+1);
  46. scanf("%f",&b[i].price); //b[i].price 是float型
  47. printf("第%d本书--售出数量:",i+1);
  48. scanf("%d",&b[i].soldCount); //b[i].soldCount 是int型
  49. gets(buff);
  50. }
  51. }
  52. void outPutToScreen(struct BOOK *b)
  53. {
  54. int i;
  55. printf("已录入的图书信息:\n");
  56. printf("===============================================================\n");
  57. printf(" ISBN\t\t书名\t作者\t售价\t售出数量\n");
  58. printf("---------------------------------------------------------------\n");
  59. for(i=0; i<3; i++)
  60. printf(" %s\t%s\t%s\t%.2f\t%5d\n",
  61. b[i].ISBN,
  62. b[i].bookName,
  63. b[i].author,
  64. b[i].price,
  65. b[i].soldCount);
  66. printf("===============================================================\n");
  67. }
  68. void outPutToDB(struct BOOK *b)
  69. {
  70. FILE *fp;
  71. int i;
  72. fp = fopen("books.db","wb");
  73. fwrite(b,sizeof(struct BOOK) *3,1,fp);
  74. fclose(fp);
  75. }
  76. void outPutToTxt(struct BOOK *b)
  77. {
  78. FILE *fp;
  79. int i;
  80. fp = fopen("books.txt","w");
  81. fprintf(fp,"已录入的图书信息:\n");
  82. fprintf(fp,"===============================================================\n");
  83. fprintf(fp," ISBN\t\t书名\t作者\t售价\t售出数量\n");
  84. fprintf(fp,"---------------------------------------------------------------\n");
  85. for(i=0; i<3; i++)
  86. fprintf(fp," %s\t%s\t%s\t%.2f\t%5d\n",
  87. b[i].ISBN,
  88. b[i].bookName,
  89. b[i].author,
  90. b[i].price,
  91. b[i].soldCount);
  92. fprintf(fp,"===============================================================\n");
  93. fclose(fp);
  94. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注