精华内容
下载资源
问答
  • 在使用C语言来对文件操作的时候,我们经常使用一些feof、fgetc函数,但是在使用的过程中也会遇到一些小问题。 问题 在今天编写C语言时候,我写了如下一段代码: #include <stdio.h> int main(){ FILE *fp = ...

    C语言中关于feof函数&fgetc函数一些理解

    前言

    在使用C语言来对文件操作的时候,我们经常使用一些feof、fgetc函数,但是在使用的过程中也会遇到一些小问题。

    问题

    在今天编写C语言时候,我写了如下一段代码:

    #include <stdio.h>
    
    int main(){
        FILE *fp = fopen("code.txt","r");
        if (fp != NULL)
        {
            while (!feof(fp))
            {
                printf("%c",fgetc(fp));
            }
        }
        else
            printf("fail to open!");
        fclose(fp);
        return 0;
    }
    

    code.txt:

    if else then a1 abc 22
    

    看上去貌似没什么问题,这是一段输出code.txt文件内所有字符的一个小程序。
    我来用图片指出一下实际出现的问题:

    可以看到输出的结果比txt文件的字符多出了一个?
    可以看到,程序输出的结果比txt文件的字符多出了一个?符号。

    解决

    经过查阅相关资料发现,fgetc函数在,传入参数fp到达文件末尾的时候,会返回一个EOF,这个EOF的实值是-1。
    那么会不会是fgetc函数多输出了一遍呢?循环到达文件末尾没有停止,而是把最后的EOF也输出了?
    我添加了两行代码,实验了一下:

    #include <stdio.h>
    
    int main(){
        FILE *fp = fopen("code.txt","r");
        putchar(-1);
        printf("\n");
        if (fp != NULL)
        {
            while (!feof(fp))
            {
                printf("%c",fgetc(fp));
            }
    
        }
        else
            printf("fail to open!");
        fclose(fp);
        return 0;
    }
    

    结果果然:
    -1的结果就是这个?符号
    -1 的输出结果果然就是这个?符号,也就是说,循环多走了一遍,才结束,导致EOF被当作字符输出了。
    在查阅相关资料后得到如下的经验:

    feof函数的判断方法不是判断当前指针是否指向文件末尾,而是根据上一次读取的返回值进行判断,如果上一次读取的返回值为EOF,那么feof(fp)为真,否则为假。

    而fgetc函数的方法刚好是:先读取当前指针指向的内容,再让指针向后移。

    这样一来,刚好,如果两者放在一起操作,就会发生多读一个EOF的现象:
    getc在读到txt文档最后一个字符的时候,fp指向最后一个字符,读出字符后,fp向后移,fp指向EOF,进行下一次循环,feof判断是否到达文档末尾:由于上一次fgetc读出的是文档最后一个字符,所以即使fp当前已经指向了EOF,feof函数还是会返回假,这样循环就又继续了,下一次循环中,就会将fp指向的EOF输出,fp后移(已经到达文档尾,无法后移);

    所以,我将代码改为了这种:

    #include <stdio.h>
    
    int main(){
        FILE *fp = fopen("code.txt","r");
        if (fp != NULL)
        {
            char ch = fgetc(fp);
            while (!feof(fp))
            {
                putchar(ch);
                ch = fgetc(fp);
            }
    
        }
        else
            printf("fail to open!");
        fclose(fp);
        return 0;
    }
    

    输出结果就是正常的:
    在这里插入图片描述

    展开全文
  • C语言文件操作函数C语言作为编程语言界泰山北斗的地位目前还是比较稳固的,小编今天在这里继续前天的文件操作函数继续深入下去,进一步为大家整理了一些常用到的文件操作函数,希望大家可以保存收藏起来,帮助自己...

    C语言文件操作函数

    C语言作为编程语言界泰山北斗的地位目前还是比较稳固的,小编今天在这里继续前天的文件操作函数继续深入下去,进一步为大家整理了一些常用到的文件操作函数,希望大家可以保存收藏起来,帮助自己提高开发的效率:

    C语言文件操作函数

    1.fputc(将一指定字符写入文件流中)

    相关函数fopen,fwrite,fscanf,putc

    表头文件 #include

    定义函数intfputc(intc,FILE * stream);

    函数说明fputc会将参数c 转为unsigned char 后写入参数stream 指定的文件中。

    返回值fputc()会返回写入成功的字符,即参数c。若返回EOF则代表写入失败。

    范例代码如下:

    #include

    main()

    {

    FILE * fp;

    char a[26]=”abcdefghijklmnopqrstuvwxyz”;

    inti;

    fp= fopen(“noexist”,”w”);

    for(i=0;i<26;i++)

    fputc(a,fp);

    fclose(fp);

    }

    2.fputs(将一指定的字符串写入文件内)

    相关函数fopen,fwrite,fscanf,fputc,putc

    表头文件 #include

    定义函数intfputs(const char * s,FILE * stream);

    函数说明fputs()用来将参数s所指的字符串写入到参数stream所指的文件内。

    返回值若成功则返回写出的字符个数,返回EOF则表示有错误发生。

    范例请参考fgets()。

    fread(从文件流读取数据)

    相关函数fopen,fwrite,fseek,fscanf

    表头文件 #include

    定义函数size_tfread(void * ptr,size_tsize,size_tnmemb,FILE * stream);

    函数说明fread()用来从文件流中读取数据。参数stream为已打开的文件指针,参数ptr指向欲存放读取进来的数据空间,读取的字符数以参数size*nmemb来决定。Fread()会返回实际读取到的nmemb数目,如果此值比参数nmemb来得小,则代表可能读到了文件尾或有错误发生,这时必须用feof()或ferror()来决定发生什么情况。

    返回值返回实际读取到的nmemb数目。

    范例代码如下:

    #include

    #definenmemb 3

    struct test

    {

    char name[20];

    int size;

    }s[nmemb];

    int main(){

    FILE * stream;

    inti;

    stream = fopen(“/tmp/fwrite”,”r”);

    fread(s,sizeof(struct test),nmemb,stream);

    fclose(stream);

    for(i=0;i

    printf(“name[%d]=%-20s:size[%d]=%d/n”,i,s.name,i,s.size);

    }

    执行

    name[0]=Linux! size[0]=6

    name[1]=FreeBSD! size[1]=8

    name[2]=Windows2000 size[2]=11

    3.freopen(打开文件)

    相关函数fopen,fclose

    表头文件 #include

    定义函数 FILE * freopen(const char * path,const char * mode,FILE * stream);

    函数说明参数path字符串包含欲打开的文件路径及文件名,参数mode请参考fopen()说明。参数stream为已打开的文件指针。Freopen()会将原stream所打开的文件流关闭,然后打开参数path的`文件。

    返回值文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno中。

    范例代码如下:

    #include

    main()

    {

    FILE * fp;

    fp=fopen(“/etc/passwd”,”r”);

    fp=freopen(“/etc/group”,”r”,fp);

    fclose(fp);

    }

    4.fseek(移动文件流的读写位置)

    相关函数 rewind,ftell,fgetpos,fsetpos,lseek

    表头文件 #include

    定义函数intfseek(FILE * stream,longoffset,int whence);

    函数说明fseek()用来移动文件流的读写位置。参数stream为已打开的文件指针,参数offset为根据参数whence来移动读写位置的位移数。

    参数 whence为下列其中一种:

    SEEK_SET从距文件开头offset位移量为新的读写位置。SEEK_CUR 以目前的读写位置往后增加offset个位移量。

    SEEK_END将读写位置指向文件尾后再增加offset个位移量。

    当whence值为SEEK_CUR 或SEEK_END时,参数offset允许负值的出现。

    下列是较特别的使用方式:

    1) 欲将读写位置移动到文件开头时:fseek(FILE *stream,0,SEEK_SET);

    2) 欲将读写位置移动到文件尾时:fseek(FILE *stream,0,0SEEK_END);

    返回值当调用成功时则返回0,若有错误则返回-1,errno会存放错误代码。

    附加说明fseek()不像lseek()会返回读写位置,因此必须使用ftell()来取得目前读写的位置。

    范例代码如下:

    #include

    main()

    {

    FILE * stream;

    long offset;

    fpos_tpos;

    stream=fopen(“/etc/passwd”,”r”);

    fseek(stream,5,SEEK_SET);

    printf(“offset=%d/n”,ftell(stream));

    rewind(stream);

    fgetpos(stream,&pos);

    printf(“offset=%d/n”,pos);

    pos=10;

    fsetpos(stream,&pos);

    printf(“offset = %d/n”,ftell(stream));

    fclose(stream);

    }

    执行 offset = 5

    offset =0

    offset=10

    5.ftell(取得文件流的读取位置)

    相关函数fseek,rewind,fgetpos,fsetpos

    表头文件 #include

    定义函数 long ftell(FILE * stream);

    函数说明ftell()用来取得文件流目前的读写位置。参数stream为已打开的文件指针。

    返回值当调用成功时则返回目前的读写位置,若有错误则返回-1,errno会存放错误代码。

    错误代码 EBADF 参数stream无效或可移动读写位置的文件流。

    范例参考fseek()。

    6.fwrite(将数据写至文件流)

    相关函数fopen,fread,fseek,fscanf

    表头文件 #include

    定义函数size_tfwrite(const void * ptr,size_tsize,size_tnmemb,FILE * stream);

    函数说明fwrite()用来将数据写入文件流中。参数stream为已打开的文件指针,参数ptr指向欲写入的数据地址,总共写入的字符数以参数size*nmemb来决定。Fwrite()会返回实际写入的nmemb数目。

    返回值返回实际写入的nmemb数目。

    范例代码如下:

    #include

    #defineset_s (x,y) {strcoy(s[x].name,y);s[x].size=strlen(y);}

    #definenmemb 3

    struct test

    {

    char name[20];

    int size;

    }s[nmemb];

    main()

    {

    FILE * stream;

    set_s(0,”Linux!”);

    set_s(1,”FreeBSD!”);

    set_s(2,”Windows2000.”);

    stream=fopen(“/tmp/fwrite”,”w”);

    fwrite(s,sizeof(struct test),nmemb,stream);

    fclose(stream);

    }

    执行参考fread()。

    【C语言文件操作函数】相关文章:

    展开全文
  • 文件操作文件的打开FILE * fopen(const char filename,const char * mode);文件的打开操作 fopen 打开一个文件(几种操作文件的组合)文件的关闭操作int fclose(FILE *fp);fclose 关闭一个文件文件的读写操作读取单个...

    文件操作

    文件的打开

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

    文件的打开操作 fopen 打开一个文件

    (几种操作文件的组合)

    文件的关闭操作

    int fclose(FILE *fp);

    fclose 关闭一个文件

    文件的读写操作

    读取单个字符

    fgetc 从文件中读取一个字符int fgetc(FILE * fp);

    fputc 写一个字符到文件中去 int fput(int c,FILE * fp);

    读取字符串

    fgets 从文件中读取一个字符串char * fgets(char * s,int n,FILE *fp);

    从文件中读取字符串并在字符串末尾添加‘\0‘,然后存入s,最多读入n-1个字符

    当读到换行符、到达文件末尾或者读满n-1个字符,函数返回该字符串的首地址

    读取失败返回空指针NULL

    因为出错和到达文件末尾都返回NULL,因此应该使用feof()和ferror()来确定函

    数fget()返回NULL的实际原因

    fgets()从指定的流读字符串,读到换行符时将换行符也作为字符串的一部分读到

    字符串中来

    fputs 写一个字符串到文件中去 int fputs(const char * s,FILE *fp);

    出现写入错误返回EOF,否则返回一个非负数

    fputs()不会在写入文件的字符串末尾加上换行符

    按格式读写文件

    fprintf 往文件中写格式化数据 int fprintf(FILE * fp,const char * format,...)

    第一个参数为文件指针,第二个参数是格式控制参数,第三个是输出参数列表

    fscanf 格式化读取文件中数据 int fscanf(FILE * fp,const char * format,...)

    第一个参数为文件指针,第二个参数是格式控制参数,第三个是地址参数列表

    按格式读写文件需要知道输出和地址参数,比较麻烦(个人认为)

    按数据块读写文件

    fread 以二进制形式读取文件中的数据

    unsigned int fread(void * buffer,unsigned int size,unsigned int count,FILE * fp)

    从fp所指的文件中读取数据并存储到buffer所指向的内存中

    buffer待读入数据块的起始地址

    size每个数据块的大小(待读入每个数据块的字节数)

    count最多允许读取数据块的个数

    函数返回的是实际读到的数据块个数

    fwrite 以二进制形式写数据到文件中去

    unsigned int fread(void * buffer,unsigned int size,unsigned int count,FILE * fp)

    buffer待输出数据块的起始地址

    size每个数据块的大小(待读入每个数据块的字节数)

    count最多允许读取数据块的个数

    函数返回的是实际读到的数据块个数

    这两个函数常于二进制文件的输入和输出

    getw 以二进制形式读取一个整数

    putw 以二进制形式存贮一个整数

    文件状态检查函数

    feof 文件结束int feof(FILE * fp);

    ferror 文件读/写出错int ferror(FILE *fp);

    文件出现错误函数返回非0值,否则,函数返回0

    clearerr 清除文件错误标志

    ftell 了解文件指针的当前位置 long tell(FILE * fp);

    成功返回文件当前读写位置,否则返回-1L

    文件定位函数

    rewind 反绕重置位置指针到文件首部 void rewind(FILE * fp);

    fseek 随机定位int fseek(FILE *fp,long offset,int fromwhere);

    功能:将fp的文件位置指针从fromwhere开始移动offset个字节指示下一个要读取的位置

    offset(偏移量)为正向后移动 为负向前移动 要求为长整型数据(常量数据后面要加L)

    fromwhere有三种取值:SEEK_SET/0表示文件来时处 SEEK_CUR/1表示文件当前位置 SEEK_END/2表示文件结尾处

    补充:

    int fflush(FILE * fp);

    无条件地把缓冲区的所有数据写入物理设备

    展开全文
  • 关闭流fputc() 写一个字符到流中fgetc() 从流中读一个字符fseek() 在流中定位到指定的字符fputs() 写字符串到流fgets() 从流中读一行或指定个字符fprintf() 按格式输出到流fscanf() 从流中按格式读取feof() ...

    fopen() 打开流

    fclose() 关闭流

    fputc() 写一个字符到流中

    fgetc() 从流中读一个字符

    fseek() 在流中定位到指定的字符

    fputs() 写字符串到流

    fgets() 从流中读一行或指定个字符

    fprintf() 按格式输出到流

    fscanf() 从流中按格式读取

    feof() 到达文件尾时返回真值

    ferror() 发生错误时返回其值

    rewind() 复位文件定位器到文件开始处

    remove() 删除文件

    fread() 从流中读指定个数的字符

    fwrite() 向流中写指定个数的字符

    tmpfile() 生成一个临时文件流

    tmpnam() 生成一个唯一的文件名//按照字符写文件

    void main()

    {

    int i=0;//循环变量

    FILE *fp=NULL;

    char buf[]="alkdjlkfjdlkjfodijfoidjdijfkldjfk";

    //Linux和win下通用

    char *filename="D:/1.txt";//文件路径名

    //打开流

    fp=fopen(filename,"a+");

    if (fp==NULL)

    {

    printf("func fopen() err\n");

    return;

    }

    for (i=0; i

    {

    //写字符到流中

    fputc(buf[i],fp);

    }

    //关闭流

    fclose(fp);

    system("pause");

    }//按照字符读文件

    void main()

    {

    FILE *fp=NULL;

    char *filename="D:/1.txt";

    //打开流

    fp=fopen(filename,"r");

    if (fp == NULL)

    {

    //打开流失败

    printf("func fopen() err\n");

    return ;

    }

    while(!feof(fp))

    {

    char tep=fgetc(fp);

    printf("%c ",tep);

    }

    fclose(fp);

    system("pause");

    }

    原文:http://blog.csdn.net/lsh_2013/article/details/45014877

    展开全文
  • c语言文件操作

    千次阅读 多人点赞 2018-12-21 09:26:46
    文件操作读写 1 文件处理原理及基本概念 C语言的文件处理功能,大体上分为两种:一种是设置缓冲区,另一种是不设置缓冲区。因为不设置缓冲区的方法直接对磁盘进行操作,速度较慢,并且由于不是C的标准函数,跨...
  • C语言中的feof函数

    万次阅读 多人点赞 2012-05-07 10:36:44
     检测流上的文件结束符 用 法  int feof(FILE *stream); 程序例  #include stdio.h>  int main(void)  {  FILE *stream;  /* open a file for reading *
  • 本次我们主要讨论以下内容:什么是文件文件名文件类型文件缓冲区文件指针文件的打开和关闭文件的顺序读写文件的随机读写文件结束的判定1.什么是文件磁盘上的文件文件。 但是在程序设计中,我们一般谈的文件有两种...
  • C语言文件操作详解

    2019-12-24 10:34:42
    C语言文件操作详解 数据流 数据流(data stream)是一组有序,有起点和终点的字节的数据序列。包括输入流和输出流。 程序与数据的交互是以流的形式进行的。进行C语言文件的存取时,都会先进行“打开文件”操作,这...
  • C语言文件操作

    2020-05-24 20:54:37
    由于结构指针的参数传递效率更高,因此C语言文件操作统一以文件指针方式实现。 定义文件类型指针的格式为:**FILE \*fp;** 其中FILE是文件类型定义符,fp是文件类型的指针变量。文件指针是特殊指针,指向的是文件...
  • C语言文件操作

    千次阅读 多人点赞 2019-11-04 20:58:15
    C语言文件操作 在C语言中,操作文件之前必须先打开文件,所谓“打开文件”,就是让程序和文件建立连接的过程。 打开文件之后,程序可以得到文件的相关信息,例如大小、类型、权限、创建者、更新时间等。在后续读写...
  • C语言文件操作总结

    2019-03-13 12:36:51
    C语言文件操作 一、标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来实现对指定文件的存取...
  • C语言文件操作函数

    2020-04-06 16:12:41
    C语言文件操作函数fopen()函数fclose()函数fgetc()函数fgets()函数fputc()函数fputs()函数文件函数用法的一些例子fprintf()函数fscanf()函数fwrite()函数fread()函数putw()函数getw()函数feof()函数ferror()函数...
  • 关于c语言文件操作

    2020-05-31 17:56:46
    c语言文件操作 ...
  • c编程 创建文件,向文件写入内容,插入内容,读取文件内容, 使用函数: fopen, fclose, fputc, fgetc, feof
  • 这些函数都是和文件读写时发生错误有关,下面一一分析: 1:ferror 原型:int ferror(FILE * fp) 作用:测试一个文件流是否被设置了错误标识符,如果是返回非 0 整数,否则返回 0。 例子: short ch; FILE *...
  • 13.1C语言文件1,两种文件存取方式(输入,输出方式)顺序存取直接存取2,数据的两种存放形式文本文件二进制文件13.2文件指针定义文件类型指针变量的一般形式:FILE *指针变量名;例如:FILE *fp1,*fp2;13.3打开文件在使用...
  • C语言文件操作函数大全

    万次阅读 多人点赞 2018-01-19 20:35:35
    C语言文件操作函数大全 2018-1-19  13.1C语言文件 1,两种文件存取方式(输入,输出方式) 顺序存取 直接存取 2,数据的两种存放形式 文本文件 二进制文件 13.2文件指针 定义文件类型指针变量的一般...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,112
精华内容 2,844
热门标签
关键字:

c语言文件操作feof

c语言 订阅