(c/c++学习笔记十三)c语言的文件操作

一.常用函数介绍

    功能:打开文件:  

    声明:    

    FILE* fopen(const char* filename, const char* mode);

    参数:filename 文件名

                mode 文件的类型和操作要求

    返回值:返回文件指针,如果出现错误会返回NULL。

    注:

    1.mode有12种,由r(读),w(写),a(追加),t(文本读写,可省略不谢),b(二进制文件),+(读和写组成),12中组合分别是:

        rt(r) 只读打开一个文本文件,wt(w)只写打开或建立一个文本文件,at(a)追加打开或建立一个文本文件。对应的二进制文件版本为rb、wb、ab。

        rt+(r+) 读写打开一个文本文件,wt(w)读写打开或建立一个文本文件,at(a)读写打开或建立一个文本文件。对应的二进制文件版本为rb+、wb+、ab+。

    2.r模式打开文件,该文件必须已经存在,否则会引起异常。

       w模式打开文件,如果文件不存在,会建立该文件,如果文件已经存在,则会删除该文件重新创建一个新的文件。

       a模式打开文件,如果文件不存在,会建立该文件,如果文件已经存在,则不会重新创建文件。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------    

    功能:从指定文件读一个字符,读取一个字符后,文件位置指针向后移动一个字节

    声明:

    int fgetc(FILE* stream);

    参数:stream 文件指针

    返回:返回读取到的字符,如果返回EOF表明已经读到了文件末尾或者出现错误。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------    

    功能:往指定文件写一个字符,写入一个字符后,文件位置指针向后移动一个字节。

    声明:

    int fputc(int c, FILE* stream);

    参数:c要写入的字符

                stream 文

    返回:正常情况下返回读取字符的ascii码值,出错时返回EOF

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------    

    功能:从指定文件中读一个字符串到字符数组中

    声明:

    char* fgets(char* str, int n, FILE* stream);

    参数:str 读出的字符串

                n 最大读取长度

                stream 文件指针

    返回:成功返回第一个参数str,失败返回NULL

    注:本函数会读出n-1个字符到str中,并在最后一个字符后加上结束标志'\0',在读出n-1个字符之前,如果遇到了换行符或EOF,则读出结束。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------    

    功能:像指定文件写入一个字符串

    声明:

    int fputs(const char* str, FILE* stream);

    参数:str 要写入的字符串

                stream 文件指针

    返回:成功返回非负整数,失败返回EOF   

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------   

    功能:从文件中读取整块数据

    声明:

    size_t fread(void* buffer, size_t size, size_t count, FILE* stream);

    参数:buffer 接收数据的内存地址

                size 数据块的字节数

                count 读数据块的块数

                stream 文件指针

    返回:实际读取数据块数,如果返回值和count不相同,可能文件结尾或出现错误。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

    功能:写整块数据到文件中

    声明:

    size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);

    参数:buffer 写入数据的内存地址

                size 数据块的字节数

                count 写数据块的块数

                stream 文件指针

    返回:实际写入数据块数,如果返回值和count不相同,可能文件结尾或出现错误。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

    功能:格式化读文件

    声明:

    int fscanf(FILE* stream, const char* format[,argument...]);

    参数:stream 文件指针

                format  格式字符串

       argument 输入列表

    返回:成功读出参数的个数。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

    功能:格式化写文件

    声明:

    int fprintf(FILE* stream, const char* format[,argument...]);

    参数:stream 文件指针

                format  格式字符串

       argument 输出列表

    返回:成功写入参数的个数。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

    功能:将文件内部指针移动到文件首。

    声明:

    void rewind(FILE* stream);

    参数:stream 文件指针

    返回值:无

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

    功能:重定位文件内部指针位置

    声明:

    int fseek(FILE* stream, long offset, int origin);

    参数:stream 文件指针

                offset  偏移量

                origin 起始点(从何处开始计算偏移量)

    注:1.偏移量可正可负,正表示向后移,负表示向前移

            2. origin的取值有 文件首:SEEK_SET 当前位置:SEEK_CUR 文件末尾:SEEK_END

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

    功能:判断文件是否处于结束位置

    声明:

    int feof(FILE* stream);

    参数:stream 文件指针

    返回值:如果文件结束返回非0值,否则返回0

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

    功能:检查文件再用各种输入输出函数进行读写时是否出错

    int ferror(FILE* stream);

    参数:stream 文件指针

    返回值:如果没有出错返回0,否则返回非0

 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

    功能:清除出错标志和文件结束标志

    声明:

    void clearerror(FILE* stream);

    参数:stream 文件指针

    返回值:无


二.一些例子

例1  fputc fgetc的应用

void main()
{
    FILE *fp;                             //定义一个文件指针
    char ch;
    fp = fopen("c:\\test.txt","w+");      //读写方式打开文件
    if(fp==NULL)                          //判断打开是否成功
        printf("fopen error");
    ch=getchar();                         //从键盘接收输入字符	
    while(ch!='\n')                       //如果遇到回车结束
    {
        fputc(ch,fp);                     //将字符写到文件里 
        ch=getchar();                     //从键盘接收输入字符	
    }                   
    rewind(fp);                           //将文件内部指针移动到文件首
    ch = fgetc(fp);                       //从文件中读一个字符
    while(ch!=EOF)                        //读到文件末尾结束
    {
        putchar(ch);                      //显示读出的字符
        ch = fgetc(fp);                   //从文件中读一个字符
    }
    fclose(fp);                           //关闭文件
}
    本例会在c盘创建一个文件,把从键盘输入的内容(以回车结束输入)写入到文件中,再把文件中的内容读出并显示出来。由于打开方式是w+,每次执行都会重新创建文件替换原来的。

例2 fpucs fgets的应用

void main()
{
    FILE *fp;                             //定义一个文件指针
    char *wStr = "123456789";             //要写入的字符串
    char rStr[20] = {0};                  //用于存放读出字符串
    fp = fopen("c:\\test.txt","w+");      //读写方式打开字符串
    if(fp==NULL)                          //判断打开是否成功
  	printf("fopen error");
    fputs(wStr,fp);                       //将字符串写入到文件内
    rewind(fp);                           //将文件内部指针移动到文件首
    fgets(rStr,strlen(wStr),fp);          //读出文件中的字符串
    printf("%s",rStr);                    //输出“12345678”
    fclose(fp);                           //关闭文件
}
    strlen的值为9,fgets读出n-1也就是8字节的内容到rStr中,并在读出内容末尾添加'\0',所以本例会打印出“12345678”。

例3 fread fwrite的应用以及fopen打开方式的应用

void main()
{
    FILE *fp;                             //定义一个文件指针
    char writeBuff[] = "12345678";        //要写入文件的数据
    char readBuff[9] = {0};               //存放读数据的缓冲
    int len = strlen(writeBuff);          //计算写入长度
    fp = fopen("c:\\test.txt","w");       //只写方式打开文件
     if(fp==NULL)                          //判断打开是否成功
     printf("fopen error");
    fwrite(writeBuff,len,1,fp);           //将数据写入文件
    rewind(fp);                           //将文件指针定位到文件开头
    fread(readBuff,len,1,fp);             //尝试读文件
    printf("%s",readBuff);                //没有输出任何内容
    fclose(fp);                           //关闭文件
}

    由于只写方式打开文件,所以无法读出内容,改成读写方式打开后即可输出“12345678”。


例4, fread(fwrite)第二、第三个参数和返回值

void main()
{
    FILE *fp;                             //定义一个文件指针
    size_t count = 0;  
    char readBuff[9] = {0};               //存放读数据的缓冲
    fp = fopen("c:\\test.txt","r");       //只读方式打开文件,文件中已经存在内容12345678
    if(fp==NULL)                          //判断打开是否成功
        printf("fopen error");
    count=fread(readBuff,8,1,fp);         //读文件,读一次,每次读8个字节
    printf("count = %d readBuff = %s\n",count,readBuff);           
    rewind(fp);                           //将文件指针定位到文件开头
    count=fread(readBuff,4,2,fp);         //读文件,读两次,每次读资格文件
    printf("count = %d readBuff = %s\n",count,readBuff);     
    fclose(fp);                           //关闭文件
} 
    执行结果:



例5 文本打开和二进制打开

void main()
{
   FILE *fp;                             //定义一个文件指针
    char ch;
   fp = fopen("c:\\test.txt","w+");      //文本读写方式打开文件
    if(fp==NULL)                           //判断打开是否成功
        printf("fopen error");
   fputc('\n',fp);                       //输入换行符      
    rewind(fp);	                       //将文件指针定位到文件开头
    ch=fgetc(fp);
    while(ch!=EOF)
    {
        printf("%02x ",ch);               //二进制打印
        ch=fgetc(fp);
    }
    printf("\n");
    fclose(fp);                           //关闭文件
}
    程序执行后,文件中的内容:

    程序显示的内容:


    在windows系统中文本模式下,系统以“\r\n”表示换行,以文本写入,函数会自动在‘\n’前加上'\r',读的时候再去掉‘\r’

    把上面例子稍作修改

void main()
{
    FILE *fp;                             //定义一个文件指针
    char ch;
    fp = fopen("c:\\test.txt","w");       //文本只写方式打开文件
    if(fp==NULL)                         
        printf("fopen error");
    fputc('\n',fp);  
    fclose(fp);                           //关闭文件
    fp = fopen("c:\\test.txt","rb");      //在以二进制只读方式打开文件
    if(fp==NULL)                        
        printf("fopen error");
    ch=fgetc(fp);
    while(ch!=EOF)
    {
        printf("%02x ",ch);
        ch=fgetc(fp);
    }
    printf("\n");
    fclose(fp);                           //关闭文件
}
    本例先用文本方式打开文件,写入换行符,再以二进制方式读文件,读出结果:

    二进制模式下,读写不会自动添加和删除‘\r’

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值