zoukankan      html  css  js  c++  java
  • 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;
    }
    


     

  • 相关阅读:
    周六,晴转雨
    时间概念
    2014-7-24-早
    2014-7-22
    [SPM_LAB]持续集成实验
    [软件测试_LAB2]使用Selenium进行自动化测试
    [软件测试_hw3]路径覆盖测试
    [软件测试_LAB1]安装junit和hamcrest及其使用
    [软件测试_hw2]Failure&Error
    [SPM_hw1]记一次项目经历
  • 原文地址:https://www.cnblogs.com/qilezaitu/p/3806986.html
Copyright © 2011-2022 走看看