判断是否读取到文件结尾问题

在c语言中,判断文件结尾有两种方法,第一种是使用feof()函数,feof(fp)用于测试fp所指向的文件的当前状态是否为“文件结束”。如果是,函数则返回的是非0值(真),否则为0(假),要注意的是,feof()是先读文件在判断是不是到达文件结束,所以当使用feof()作为循环判断条件的话,就需要注意一种情况,就是当文件为空的时候,它也会读取一次文件内容然后再跳出循环,所以有可能会读取到一些不可知的内容出来。

EOF是文本文件结束的标志。在文本文件中,数据是以字符的ASCⅡ代码值的形式存放,ASCII代码值的范围是0~255,EOF的16进制代码为0xFF(十进制为-1),因此可以用EOF作为文件结束标志。但是如果文件格式为二进制文件,就不适合用EOF来判断文件到达结尾了,因为有可能文件中也存在一个数据为0xFF,这样当读取到这个数据是,就无法判断是到达文件结尾,还是读取到的是文件的内容了。

注意,feof()与EOF不同:feof()是函数,用来检测文件的结束;EOF是 End Of File 的缩写,是C语言中标准库中定义的宏,定义为:#define  EOF  (-1)。

 

二进制文件和文本文件的区别:

C语言支持的是流式文件,它把文件看作由一个一个的字符(字节)数据组成的序列。根据数据的组织和操作形式,可以分为ASCII文件和二进制文件。

ASCII文件又称为文本文件,它是在一个字节的存储单元上存放一个字符(在外存中存放的是该字符的ASCII码,每个字符将占一个字节)。

二进制文件是把内存中的数据按其在内存中的存储格式在磁盘上原样保存。 

对字符而言,由于其外存存储格式和内存表示格式相同,所以,在外存上也存放每个字符的ASCII码。

文本文件:读取:

void read(void)
 2 {
 3     int ch;
 4     FILE *fp;
 5     if((fp=fopen("txt.txt","rt"))==NULL)
 6     {
 7         printf("读取信息失败,请重试");
 8         getchar();
 9         exit(1);
10     }
11     ch=fgetc(fp);                    //首先从文件中读取,判断是不是文件结束符EOF
12     if(ch==EOF)
13     {
14         printf("什么都没有");
15         fclose(fp);
16         return;                        //如果是直接关闭文件退出
17     }
18     rewind(fp);                      //这步很重要,如果判断不是,让文件内部的指针重新指向文件开头  
19     while(!feof(fp))    
20     {
21             ...                              //正常读取文件内容  
22     }           

二进制读取文件:

法一:fopen_s(&fp_in,"a.bin","rb");
if (fp_in == NULL) {
    printf("open failed!\n");
    return;
}
while (!feof(fp_in)) {
    ret = fread(buffer,1,sizof(buffer),fp_in);//一次读取全部,buffer要定义足够大,栈空间较小,所以要定义成全局变量
}

发二:

size = 0;
while (1) {
    ret = fread((buffer, 1,1024, fp_in); //一次读取1024字节,返回值是0时,说明读取结束。
    if (ret <= 0) {
        break;
    }
    size += ret;
}

按行读取文本文件:

buffer[256][256];

while (!feof(fp)) {
    fgets(buffer[cnt++],Max_file_columns,fp);//按行读取
}
fclose(fp);

PS:字符串的相关函数:
strtok(Str,"format");//字符串分割符,返回头指针。

void rewind(FILE *stream);//设置文件位置为给定流 stream 的文件的开头。

 

你可能感兴趣的:(c)