计算机中的文件分为两类:
- 文本文件
- 二进制文件
操作文件的一般分为三步:
- 打开文件
- 操作文件
- 关闭文件
下面看看每个步骤的作用:
打开文件:让磁盘上的文件与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;
}