c语言-文件常用的操作

计算机中的文件分为两类:

  1. 文本文件
  2. 二进制文件

操作文件的一般分为三步

  1. 打开文件
  2. 操作文件
  3. 关闭文件

下面看看每个步骤的作用:

打开文件:让磁盘上的文件与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;
}


 

 

posted @ 2012-09-24 21:11  骑乐在途  阅读(180)  评论(0编辑  收藏  举报