@SuHongjun
2020-05-07T07:31:30.000000Z
字数 5438
阅读 185
C语言 未分类
文件操作示例:
#include "stdio.h"main(){FILE *fp; //定义文件指针//struct _iobuf *fp2;fp = fopen("H.txt","w"); //打开文件fprintf(fp,"Hello world!\n"); //对文件进行读、写fclose(fp); //关闭文件}/*文件操作4部曲:定义文件指针打开文件对文件进行读、写关闭文件*/
struct _iobuf {char *_ptr;int _cnt;char *_base;int _flag;int _file;int _charbuf;int _bufsiz;char *_tmpfname;};typedef struct _iobuf FILE;
fopen() 函数的打开方式:FILE *fopen(char *filename, char *mode);
filename为文件名(包括文件路径),mode为打开方式,它们都是字符串。
整体来说,文件打开方式由 r、w、a、+、t、b 六个字符拼成
r、w、a、+表示读写权限:r: read,读w: write,写a: append,追加+: 读和写
t、b表示读写方式:t: text,文本文件,读写方式的默认值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()
各函数的原型:
//int feof(FILE *fp); //【返回值】检测到文件结束标识返回1,否则返回0。格式化读写文件://int fscanf ( FILE *fp, char * format, ... );//int fprintf ( FILE *fp, char * format, ... );以字符串的形式读写文件://char *fgets ( char *str, int size, FILE *fp );//int fputs( char *str, FILE *fp );以字符形式读写文件://int fgetc(FILE *fp);int fputc ( int ch, FILE *fp );
应用实例:
#include "stdio.h"main(){FILE *fp;char buf[300];int readCount;fp = fopen("格式化读写文件.txt","wt");fprintf(fp,"格式化读写文件:\n");fprintf(fp,"//int fscanf ( FILE *fp, char * format, ... );\n");fprintf(fp,"//int fprintf ( FILE *fp, char * format, ... );\n");fclose(fp);fp = fopen("格式化读写文件.txt","rt");readCount = fscanf(fp,"%s",buf);printf("%s\n",buf);readCount = fscanf(fp,"%s",buf);printf("%s\n",buf);readCount = fscanf(fp,"%s",buf);printf("%s\n",buf);//fscanf()读入并显示的内容和fprintf()输出的内容并不一致}
/*以字符串的形式读写文件:char *fgets ( char *str, int size, FILE *fp );int fputs( char *str, FILE *fp );*/#include "stdio.h"main(){FILE *fp;char buf[300];int readCount;fp = fopen("以字符串的形式读写文件.txt","wt");fputs("格式化读写文件:\n",fp); //fputs()并不会自动附加换行符fputs("char *fgets ( char *str, int size, FILE *fp );\n",fp);fputs("int fputs( char *str, FILE *fp );\n",fp);fclose(fp);fp = fopen("以字符串的形式读写文件.txt","rt");fgets(buf,300,fp);printf("%s",buf);fgets(buf,300,fp);printf("%s",buf);fgets(buf,300,fp);printf("%s",buf);}
//写#include "stdio.h"main(){FILE *fp; //定义文件指针fp = fopen("Hello.txt","w"); //打开文件fprintf(fp,"===================================\n"); //对文件进行读、写fprintf(fp,"Hello world!\n"); //对文件进行读、写fprintf(fp,"===================================\n"); //对文件进行读、写fprintf(fp,"欢迎来昆明做客!\n"); //对文件进行读、写fclose(fp); //关闭文件}
#include "stdio.h"main(){FILE *fp;char buf[200];fp = fopen("Hello.txt","r");while(!feof(fp)){fgets(buf,200,fp); //char *fgets(char *s, int size, FILE *stream);puts(buf);}fclose(fp);}
#include "stdio.h"main(){FILE *fp;char buf[200], c;fp = fopen("Hello.txt","r");while(!feof(fp)){fscanf(fp,"%s",buf); //int fscanf(FILE *stream, char *format,[argument]);printf("%s\n",buf);}fclose(fp);}
#include "stdio.h"main(){FILE *fp;char buf[200], c;fp = fopen("Hello.txt","r");if( fp != NULL ){while( (c = fgetc(fp)) != EOF ) //int fgetc(FILE * stream);putchar(c);}printf("\n");fclose(fp);}
.............
#include "stdio.h"struct BOOK //结构体类型定义,BOOK是类型名,定义的新类型是:struct BOOK类型{char ISBN[50]; //结构体的成员char bookName[100];char author[100];float price;int soldCount;};void InputBookInfo(struct BOOK *b);void outPutToScreen(struct BOOK *b);void outPutToTxt(struct BOOK *b);void outPutToDB(struct BOOK *b);void GetBookInfoFromDB(struct BOOK *b);main(){struct BOOK b[100]; //b是一个结构体数组,数组元素的类型是:struct BOOKGetBookInfoFromDB(b);//InputBookInfo(b);outPutToScreen(b);//outPutToTxt(b);//outPutToDB(b);}void GetBookInfoFromDB(struct BOOK *b){FILE *fp;int i;fp = fopen("books.db","rb");fread(b,sizeof(struct BOOK) *3,1,fp);fclose(fp);}void InputBookInfo(struct BOOK *b){int i;char buff[100];printf("请录入图书信息:\n");for(i=0; i<3; i++){printf("第%d本书--ISBN:",i+1);gets(b[i].ISBN); //b[i].ISBN 是数组名printf("第%d本书--书名:",i+1);gets(b[i].bookName); //b[i].bookName 是数组名printf("第%d本书--作者:",i+1);gets(b[i].author); //b[i].author 是数组名printf("第%d本书--售价:",i+1);scanf("%f",&b[i].price); //b[i].price 是float型printf("第%d本书--售出数量:",i+1);scanf("%d",&b[i].soldCount); //b[i].soldCount 是int型gets(buff);}}void outPutToScreen(struct BOOK *b){int i;printf("已录入的图书信息:\n");printf("===============================================================\n");printf(" ISBN\t\t书名\t作者\t售价\t售出数量\n");printf("---------------------------------------------------------------\n");for(i=0; i<3; i++)printf(" %s\t%s\t%s\t%.2f\t%5d\n",b[i].ISBN,b[i].bookName,b[i].author,b[i].price,b[i].soldCount);printf("===============================================================\n");}void outPutToDB(struct BOOK *b){FILE *fp;int i;fp = fopen("books.db","wb");fwrite(b,sizeof(struct BOOK) *3,1,fp);fclose(fp);}void outPutToTxt(struct BOOK *b){FILE *fp;int i;fp = fopen("books.txt","w");fprintf(fp,"已录入的图书信息:\n");fprintf(fp,"===============================================================\n");fprintf(fp," ISBN\t\t书名\t作者\t售价\t售出数量\n");fprintf(fp,"---------------------------------------------------------------\n");for(i=0; i<3; i++)fprintf(fp," %s\t%s\t%s\t%.2f\t%5d\n",b[i].ISBN,b[i].bookName,b[i].author,b[i].price,b[i].soldCount);fprintf(fp,"===============================================================\n");fclose(fp);}