计算机中的文件分为两类:
- 文本文件
- 二进制文件
操作文件的一般分为三步:
- 打开文件
- 操作文件
- 关闭文件
下面看看每个步骤的作用:
打开文件:让磁盘上的文件与FILE结构体的指针建立关联。
FILE结构体:
struct _iobuf { char *_ptr; //文件输入的下一个位置 int _cnt; //当前缓冲区的相对位置 char *_base; //指基础位置(应该是文件的其始位置) int _flag; //文件标志 int _file; //文件的有效性验证 int _charbuf; //检查缓冲区状况,如果无缓冲区则不读取 int _bufsiz; //文件的大小 char *_tmpfname; //临时文件名 }; typedef struct _iobuf FILE;
操作文件:对文件的随机读写操作。
关闭文件:将缓冲区的数据更新到文件,并断开与FILE结构体的关联将FILE的指针置为NULL。
在每个步骤中的常用函数:
打开文件:FILE *fopen( const char *filename,const char *mode);
filename:打开的文件名。
mode::打开的文件的方式。
r 以只读方式打开文件,该文件必须存在。
r+ 以可读写方式打开文件,该文件必须存在。
rb+ 读写打开一个二进制文件,允许读数据。
rw+ 读写打开一个文本文件,允许读和写。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
wb 只写打开或新建一个二进制文件;只允许写数据。
wb+ 读写打开或建立一个二进制文件,允许读和写。
ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。
Eg:FILE *fp = fopen("E:\\a.out", "w+")
操作文件:
1.读写函数
intfputc( int c, FILE *stream );
intfgetc( FILE *stream);
size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
int feof( FILE *stream );
int fprintf( FILE *stream,const char *format [,argument ]...);
int fscanf( FILE *stream,const char *format [,argument ]... );
char *fgets( char *string,intn, FILE *stream);
int fputs( const char *string,FILE *stream);
2.随机定位函数
void rewind( FILE *stream); //将文件指针定位到文件开始出
int fseek( FILE *stream, long offset, int origin );//定位文件指针位置
origin:
文件开始 SEEK_SET 0
文件当前位置 SEEK_CUR 1
文件末尾 SEEK_END 2
long ftell( FILE *stream );//获取现在文件指针的位置
注:函数的详细说明请查阅MSDN。
3.错误检测函数
int ferror( FILE *stream ); //获取文件的错误信息和GetLastError()功能相同
void clearerr( FILE *stream );//清楚错误信息
关闭文件:
int fclose( FILE *stream );
思维导图:
实例:
功能说明:在已有的文本文件中查找单词。找到后将其查询次数加一来统计本单词的查询次数。
源代码:
long Find(char *word, FILE *fp) { int strLen = strlen(word); if(fp != NULL && strlen > 0) { int wordPos = 0; char ch = 0; do { ch = fgetc(fp); if(ch == word[wordPos]) { while (!feof(fp)) { ch = fgetc(fp); if(ch != word[++wordPos]) { break; } } if(strLen == wordPos) { return ftell(fp); } wordPos = 0; } } while(!feof(fp)); } return -1; }
功能:这个函数是将文件指针定位到需要查找的单词处并返回位置。
bool Modify(FILE *fp, long pos) { if(0 == fseek(fp, pos, SEEK_SET)) { int curCount = 0; fscanf(fp, "%d", &curCount); ++curCount; fseek(fp, pos , SEEK_SET); if(fprintf(fp, "%d\n", curCount) > 0) { return true; } } return false; }
功能:修改指定单词的查询次数。
int main() { char word[20]= {0}; FILE *fp; if((fp = fopen("E:\\words_list.txt", "r+")) == NULL) { printf("Cannot open file.\n"); return -1; } printf("Please Enter your word:"); scanf("%s", word); long modifyPos = Find(word, fp); if(modifyPos != -1) { if(Modify(fp, modifyPos)) { printf("Modify success!\n"); } else { printf("Modify success!\n"); } } else { printf("Find failed!\n"); } fclose(fp); system( "type E:\\words_list.txt" ); return 0; }