精华内容
下载资源
问答
  • 判断文件结束,有许多方式,比如读取文本文件和二进制文件就可以使用不同的方式,下面分别进行详细介绍和举例。 使用EOF判断文件是否结束 EOF的值为-1,所以往往使用EOF也可以判断文件是否结束,一般用在非格式化...

    C语言文件读写-判断文件是否结束

    在读文件的时候,很重要的一个条件是:文件是否结束,因为文件已经结束了,就不用继续读文件了。

    判断文件结束,有许多方式,比如读取文本文件和二进制文件就可以使用不同的方式,下面分别进行详细介绍和举例。

    使用EOF判断文件是否结束

    EOF的值为-1,所以往往使用EOF也可以判断文件是否结束,一般用在非格式化文本文件读取中,如果在格式化文本读取时使用EOF来判断,在某些情况下是会出错的。

    函数fgetc返回的值为一个字符,当文件结束时,返回EOF,因为文本文件中可打印字符没有字符的值是-1,所以,可以用EOF来判断文件是否结束了。

    这也是唯一的一个可以使用EOF来判断文件是否结束,而且永远正确的函数,前提是必须是读文本文件(格式化或者非格式化都可以支持)。

    我们来看一下使用fgetc和EOF来检测文件是否结束的例子,代码如下:

    void EOF_test_getc(const char* file_name)
    {
    	int ch = 0;
    	int count = 0;
    	FILE *file = fopen(file_name,"r");
    	if(!file)
    		return;
    	while(1)
    	{
    		ch = fgetc(file);
    		if(ch == EOF)
    		{
    			printf("reach the end of file,the char number is %d\n",count);
    			break;
    		}
    		else
    		{
    			count++;
    			putchar(ch);
    		}
    	}
    	fclose(file);
    }

    在代码中,我们使用fgetc来读取文件中的每一个字符,如果读取到的字符是EOF,则结束读取,每读取一个字符,就对count++,以统计文件中字符的个数。运行效果如图所示。

    但是出现了一个奇怪的问题,程序中统计出来的字符是98个,但是文件大小却是102个字节,相差了4个字符,那4个字符到哪里去了?

    《C语言文件读写(1)-文本文件读操作》

    中提到,在Windows上,如果写入行结束符'\n',系统会自动替换为'\r\n',在读取的时候,会自动把'\r\n'转换为'\n',因为我们这个文件有4行,所以文件中就多了4个'\r',这就是为什么文件的实际大小会比读取出来的字符多了4个的原因。

    注意,这种判断文件结束的方式只能针对文本文件,不能用在二进制文件上面,因为二进制文件的内容什么值都可以存储,-1也会是其中的一个值。

    fscanf和fscanf_s有时候也可以用EOF来判断文件是否结束,而且在前面的几篇文章中也确实使用了这种方式来判断,但是,如果文本文件中的内容一旦有一点错,scanf中的format字符串不能匹配,则永远都不会返回EOF这个值,就会造成死循环,所以在使用fscanf或者fscanf_s的时候,不推荐使用返回值EOF来判断文件是否结尾,而是使用feof函数来检测,后面会介绍。

     

    使用是否为NULL来判断

    函数fgets用来获取一行的文本文件数据,如果返回为NULL,则表示文件结束了或者读取错误,所以有时候也可以使用返回值是否为NULL来判断文件是否结束,示例代码如下:

    void read_text_by_gets(const char* file_name)
    {
    	char buffer[128]={0};
    	FILE *file = fopen(file_name,"rt");
    	if(!file)
    		return;
    	while(NULL != (fgets(buffer,sizeof(buffer),file)))
    	{
    		//显示每一次读取到的内容
    		printf("%s",buffer);
    	}
    	fclose(file);
    }

    这在绝大多数的时候都可以判断文件是否真的结束了,但是,如果读取文件出错了,也会返回NULL,这就不能区分是文件真的结束了,还是由于别的原因读取错误,所以,并不推荐用这种方式来检测文件是否结束。

    通过返回值的大小来判断

    我们在使用fread来读取二进制文件的时候,往往可以通过返回值是否等于count的值来判断文件是否结束,大多数情况下是没有问题的,示例代码如下:

    
    void read_binary_file(const char* file_name)
    {
    	struct Student stu={0};
    	FILE *file = fopen(file_name,"rb");
    	if(!file)
    		return;
    	while(fread(&stu,sizeof(stu),1,file) == 1)
    	{
    		printf("学号:%d 姓名:%s 学院:%s 分数:%.2f\n",stu.ID,stu.Name,stu.College,stu.Score);		
    	}
    	fclose(file);
    }

    在示例代码中,fread因为我们每次只读一个Student的大小,所以如果返回的值小于1的话,则说明文件结束了。

    同样的原因,fread如果出错了的话,返回值也是可能小于1的,因此这个判断也不是100%准确的。

     

    使用feof来判断

    feof的原型为:

    int feof( FILE *stream );

       
       

    返回值是一个整数,如果为0,表示文件没有结束,如果非0,表示文件结束。

    但是要特别注意一点的是,这个函数的实现机制是这样的:

    是在下一次读取的时候判断是否到了文件末尾,如果是,则设置文件结束标志,它并不是在调用feof这个函数的时候去检查数据来判断是否到了文件的末尾。所以这个函数的使用,很多朋友都会用错,以为这是一个真正检查文件是否结束的函数,当然,它确实是,但是它不是即时的。

    我们先看一下文本文件的例子,仍然以刚才的student.txt为例,代码如下:

    void feof_test_getc(const char* file_name)
    {
    	int ch = 0;
    	int count = 0;
    	FILE *file = fopen(file_name,"r");
    	if(!file)
    		return;
    	while(!feof(file))
    	{
    		count++;
    		ch = fgetc(file);
    		putchar(ch);
    	}
    	printf("reach the end of file,the count is %d\n",count);
    	fclose(file);
    }
    int main(int argc, char* argv[])
    {
    	feof_test_getc("student.txt");
            return 0;
    }

    这个代码几乎是我遇到的所有初学C语言甚至是学了C语言很长时间的朋友的写法,确实,看起来没有任何问题,我们来看一下运行结果,如图所示。

     

    请注意,count的值是99,而且最后一行还多输出一个字符,这就是为什么在论坛上会经常看到为什么会多出一行,多出一个之类的讨论。

    这确实就是缺乏对feof的理解造成的,我们以为feof就是一个实时监测文件是否结尾的函数,其实并不是,当你使用fgetc或者任何别的函数读取文件内容的时候,如果读取的内容刚好是文件的最后一个字符,这个时候调用feof的话,返回仍然是0,因为它并不会去真的检查文件是否结尾,它要依赖下一次的读取操作,下一次再次读取的时候,发现文件已经到了结尾,则设置文件结束标志,feof调用的时候才会返回非0值。

     

    现在来演示一下一个代码,可以更好地理解feof的工作机制,代码如下:

    void feof_test()
    {
    	int test = 0;
    	char ch = 't';
    	char str[20]="test";
    	FILE *file1,*file2,*file3;
    	//第一种情况
    	file1=fopen("test1.dat","w+");
    	fprintf(file1,"%c",ch);
    	rewind(file1);
    	fscanf(file1,"%c",&ch);
    	if(feof(file1))
    	{
    		printf("文件1结束\n");
    	}
    	else
    	{
    		printf("文件1没有结束\n");
    	}
    	fclose(file1);
    	//第二种情况
    	file2=fopen("test2.dat","w+");
    	fprintf(file2,"%d",10);
    	rewind(file2);
    	fscanf(file2,"%d",&test);
    	if(feof(file2))
    	{
    		printf("文件2结束\n");
    	}
    	else
    	{
    		printf("文件2没有结束\n");
    	}
    	fclose(file2);
    	//第三种情况
    	file3=fopen("test3.dat","w+");
    	fprintf(file3,"%s",str);
    	rewind(file3);
    	fscanf(file3,"%s",str);
    	if(feof(file3))
    	{
    		printf("文件3结束\n");
    	}
    	else
    	{
    		printf("文件3没有结束\n");
    	}
    
    	fclose(file3);
    
    }

     在这个测试中,写入三个文件,然后分别打开对应的文件从头开始读取,然后判断feof是否返回非0值,其中第一种情况,返回0,第二种和第三种返回非0。

    先看一下运行结果,再来解释为什么。结果如图所示。

    为什么会产生这个差别呢?先说第一种情况,写入了一个字符,然后读取一个字符,虽然文件中只有一个字符,但是读取一个字符就够了,所以并不知道文件是否结束。

    第二种情况,写入数字10到文件,然后读取一个整数,为什么就检查到文件结束了呢?因为读取一个整数的时候,会一直读,直到读取到空格或者别的结束符或者超过整数范围的时候才会结束,因为文件中存的是10,所以会一直读到文件结束,10是没有超过整数范围的。

    第三种情况和第二种情况一样,读取一个字符串的时候也要一直读,直到遇到空格或者tab之类的,由于文件中只有test这四个字符,自然就会读到文件尾了。

    所以第二和第三种情况都会返回非0值,表示文件结束了。

     

     

    展开全文
  • 使用feof()函数判断文件是否结束

    千次阅读 2019-07-08 21:08:47
    feof(fp)为假,判断文件结束,其实文件在前一次循环中已经结束了。 代码还可以这样写: 1 ch= fgetc(fp); 2 while (ch!= EOF) 3 { 4 putchar(ch); 5 ch= fgetc(fp); 6 } 处理文本文件,在...

    课本上时这样写的:(用putchar(ch);代表对取出来的字符的处理。)

    1 while(!feof(fp))
    2 {
    3     ch=fgetc(fp);
    4     putchar(ch);
    5 }

    但是,这样写的话,fgetc()函数总是会多读入一个字符。

    应该改为如下形式:

    1 ch=fgetc(fp);
    2 while(!feof(fp))
    3 {
    4     putchar(ch);
    5     ch=fgetc(fp);
    6 }

    只有当从文件输入“文件结束符”后,才能使用feof(fp)函数判断文件是否结束。

    课本上的代码是这样运行的:使用ch=fgetc(fp);从文件读入了文件结束符,然后输出文件结束符(-1)对应的字符(其实是乱码,没有ASCII为-1的字符),然后再根据!feof(fp)为假,判断文件结束,其实文件在前一次循环中已经结束了。

    代码还可以这样写:

    1 ch=fgetc(fp);
    2 while(ch!=EOF)
    3 {
    4     putchar(ch);
    5     ch=fgetc(fp);
    6 }

    处理文本文件,在判断文件是否结束时,两种方法:ch!=EOF;或者!feof(fp);除了这两个表达式之外的其它代码不要变动。

    处理二进制文件,只能使用!feof(fp)判断文件是否结束。

    转载于:https://www.cnblogs.com/Camilo/p/3379538.html

    展开全文
  • 在有null值的情况下会出问题,建议使用!feof()
    在有null值的情况下会出问题,建议使用!feof()
    
    展开全文
  • C++读入文件 判断文件 是否存在 及 是否为空 及 是否结束

    1 判断文件是否存在: 

    ifstream fin(str.c_str());
     if(!fin)
     {
      cout <<"no such file,please check the file name!/n";
      exit(0);
     }

    2 判断是否为空:
     char c,ch;
     fin >> c;
     if(fin.eof())
     {
      cout <<"nothing!/n";
      exit(0);
     }

    3 判断是否结束:

    if(!fin.eof())

    {

       cout << "not end!/n";

    }

     

    对于判断是否为空尚存疑虑,即使一个空文件也要读入一个字符后再通过判断文件是否结束来判断此文件是否为空,

    那么这个读入的字符到底是什么呢?空文件的末尾是否存在一个结束符?待办。

    展开全文
  • with open('awod.txt','rb') as f: print(f.seek(0,2))
  • c++ 文件结束判断

    千次阅读 2018-06-05 16:40:00
    转载 - C++ - 关于ifstream/fstream流 判断文件是否结束eof()的问题 出处:http://blog.csdn.net/shuilan0066/article/details/4669451   1、 ifstream in("config.txt", ios::in); if (!in) { cerr ...
  • 这种使用“-1”作为判断文本文件结束标志而不能作为判断二进制文件是否结束。尽管二进制文件的结尾标记也是-1,当程序读取到一个正好为-1的字节时,就难以偶按段是文件结尾还是文件中的有效数据。 对于标准的...
  • C语言读取文件判断是否读取结束

    千次阅读 2019-09-07 15:44:16
    读取文件时,判断内容是否已经为空当目前所读取的字符为EOF时说明后面内容为空或者直接使用feof()函数 当目前所读取的字符为EOF时说明后面内容为空 char ch; FILE* fp=fopen(********); ch=fgetc(fp); if(ch==EOF) ...
  • C/C++中读取文件判断是否读取结束

    万次阅读 2016-11-22 16:16:41
    最近用C++读取文件时遇到了一个问题,读取如下图所示的文件时,使用C中的feof()判断是否读取结束,总会在文件末尾处总会多读一遍。 可以看到我读取的文件格式是比较简单的,没两行为一对,第一行有两个int类型的...
  • Java判断文件是否完整

    千次阅读 2013-01-25 00:00:36
    需求:需要判断一个文件是否正常结束,正常情况最后一行为某段字符串(结束标志) 代码: /** * 判断一个文件的最后一行是否为某字符串 * * @param src * 文件路径 * @param key * 判断是否最后一行的字符串...
  • 按行遍历读取文件的方法,通过这个方法,readline() 每次只读取一行,通常比 .readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 .readline() filename = raw_input('Enter your file ...
  • 判断读取文件结束的一点心得

    千次阅读 2014-04-01 12:42:07
    找了相关资料,再加上看了一个提问(如何判断读取文件结束)中各位高手的见解。终于有了点眉目。 对于其他,上面那些高手说了很多,我也不多说。根据高手们的见解,再结合我自己一情况,读到文件结尾(测试的时候
  • 判断文件是否写入完毕

    万次阅读 2016-05-11 15:29:51
    在对文件进行读取,复制等操作前,往往需要去判断文件是否已经完全写入完毕,如果这个文件的写入操作是在你自己写的代码里,那么可以通过自己添加一些标志位来获取当前文件的写入状态,但是如果文件的写操作并非是你...
  • 判断文件结束函数(feof)

    千次阅读 2013-05-25 16:26:22
    函数feof(fp//文件指针)用于测试fp所指向的文件内部位置指针是否指向文件结束。如果是文件结束,函数feof(fp)的值为1(真),如果不结束,函数feof(fp)的值为0(假),feof函数可判断二进制文件和文本文件的...
  • 如何判断文件是否读到文件结尾

    千次阅读 2017-04-10 22:32:44
    头文件:#include #define feof(_stream) ((_stream)->_flag & _IOEOF)feof()函数用来检测当前文件流上的文件结束标识,判断是否读到了文件结尾,其原型为: int feof(FILE * stream);【参数】stream为文件流指针...
  • 网上资料中很多是通过try catch 获取文件是否读取完毕.... 可直接判断文件结束. FileStream fs = File.OpenRead(path); BinaryReader brReader = new BinaryReader(fs); while (brReader.BaseStream.Position
  • shell脚本判断文件是否存在

    万次阅读 2019-02-12 16:55:06
    有一个需求是判断某一个目录下文件是否存在,如果该文件不存在,则从当前目录拷贝文件到该目录。  由于没有学习写过shell脚本,晚上下班回来搜索后写出了如下的脚本,这里shell的if语法格式与C语言大致相同,语法...
  • shell判断文件是否发生变化

    千次阅读 2019-06-20 17:46:44
    公司有个需求,通过检测文件是否变化,而判断是否进行发布操作, 以下为判断代码 #!/bin/bash # 检测的文件 package=/data/file.index # 记录 md5值的文件 md5=package_md5 # 创建新的md5信息 package_md5_new=$(md5...
  • 判断文件结束的三种方法(经典)

    千次阅读 2013-09-01 15:44:51
    判断文件结束的三种方法: a) char p[1024]; while(fgets(p, 1024, src) != NULL)  fputs(p, des1); b) int c; while((c = fgetc(src)) != EOF)  fputc(c, des2); c) int n; char s[20]; while((n = ...
  • gets与scanf如何判断读取文件结束

    千次阅读 2013-12-23 18:42:20
    gets与scanf如何判断读取文件结束 (1) void * =====NULL (2)int =======EOF=======0 当出错或到文件末尾时: scanf() 返回int,故与EOF匹配 gets() 返回char * ,故与NULL匹配 两个例子: (1)...
  • VB 判断文件是否存在

    万次阅读 2011-04-12 11:49:00
    方法一:  在编程时经常会用到判断文件是否存在,比如对文件做读写操作前,或是判断密钥文件是否存在等。判断的方法有很多,有些方法虽很实用,但有点繁琐。其实还可以有更简单的方法,就是使用vb 6.0...
  • Java判断上传文件是否重复

    千次阅读 2018-12-19 16:31:51
    近期的项目中接到一个需求,文件...要判断文件是否重复,就需要对每次上传的文件计算MD5值,上传前通过查询文件库中是否存在该MD5值,来判断是选择上传还是直接复制已存在的文件路径。 方法一: 使用org.apache.comm...
  • java判断文件是否正在写入

    万次阅读 2017-12-15 00:00:50
    Flink批处理时,遇到一个场景:flink在分析日志文件时,如果日志文件已经存在,flink则会正确读取并分析日志文件。这里问什么说正确读取呢?假设,日志文件很大,大到100M,在慢网络情况下,将日志文件发送到slave...
  • c++读取文件结束条件的判断

    千次阅读 2015-06-06 23:02:49
    在使用C/C++读文件的时候,一定都使用过eof()这个函数来判断文件是否为空或者是否读到文件结尾了,也会在使用这个函数的过程中遇到一些问题,如不能准确的判断是否为空或者是否到了文件尾,以至于有些人可能还会...
  • shell——判断文件是否存在

    千次阅读 2015-07-21 16:38:52
    初次使用Markdown编辑器来编写博客,希望有不一样的体会本文...以下为shell下的具体操作1、shell判断文件,目录是否存在或者具有权限” #!/bin/sh myPath=”/var/log/httpd/” myFile=”/var /log/httpd/access.lo
  • 例子:从键盘输入若干行字符(每行长度不等),输入后把它们存储到一磁盘文件中。再从该文件中读入这些数据,将其中小写字母转换成大写字母后再显示屏上输出。 有两种方法 1.使用feof()函数 1 #include<...
  • 判断文件是否下载完成的方法

    千次阅读 2020-01-10 17:31:56
    使用MD5,本地文件下载完后去文件的md5值与服务器的该文件md5进行比对,一致证明下载完全。 比较文件的size,文件长度,下载完成取下File.length,与服务器的文件长度比对,一致则下载完全。 文件命名法,开始下载时...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 538,808
精华内容 215,523
关键字:

判断文件是否结束