C语言获取txt文件大小两种方法的差异

方法1:

FILE *p=("jiuibf.txt","rt");
int length;
for(;fgetc(p)!=EOF;length);
方法2:
FILE *p=(jiuibf.txt","rb");
int length;
fseek(p,0,2);
length=ftell(p);
这两种方法获得的length不同,方法2获得的比方法1的大很多,求解释。
为了探究这个问题,我自己新建一个很小的txt文件,用以上两种方法测试长度,发现方法一测试的长度不含文件中的,换行符;求解释。
用方法1来得到文件的大小是很费时间的,是否有其他方法快速得到txt文件的方法1大小。

我测试了你的代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void main()
{
FILE *p=fopen("d:\\jiuibf.txt","rt");
int length = 0;
for(;fgetc(p)!=EOF;length++);
fclose(p);
printf("第一种方式,文件长度=%d\n",length);
p=fopen("d:\\jiuibf.txt","rb");
fseek(p,0,2);
length=ftell(p);
fclose(p);
printf("第二种方式,文件长度=%d\n",length);
}

文本文件的内容是:

FILE *p=("jiuibf.txt","rt");

int length;

for(;fgetc(p)!=EOF;length);

FILE *p=(jiuibf.txt","rb");

int length;

fseek(p,0,2);

length=ftell(p);

程序的输出是:

原因分析:

在windows下,以文本方式写入文件的\n会被转换为\r\n(也就是0x0D0A),输出的时候,\r\n会被转换回\n。

fgetc在读入时会将\r\n转换成一个\n;上面的文本文件有6个回车换行。

所以第一种方式比第二种方式少6


C语言获得文件的长度方式就是第二种:

FILE*fp;
fp=fopen("localfile","rb");// localfile文件名
fseek(fp,0,SEEK_SET);
fseek(fp,0,SEEK_END);
long longBytes=ftell(fp);// longBytes就是文件的长度

追问

棒棒哒

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-11-20

移动到文件尾后,使用ftell获取到文件大小值的方法是正确的。


要获取文件大小,有两种可行的方法。

1 将文件指针移动到文件尾,并通过ftell获取到结果。

fseek(fp, 0, SEEK_END);
size = ftell(fp);

这种方法得到的是绝对准确的值。因为ftell返回的就是文件指针对文件头的偏移量,单位为字节。


2 将文件依次读取,直到文件结尾。统计实际读取到的字符个数。

int size = 0;
while(fgetc(fp) != EOF) size ++;

程序运行后的size值即为文件大小。

这种方法是不一定准确的。要依赖一些因素。当在非windows环境下,该方法准确。

当打开文件方式为"rb"时,该方法也准确。

但当windows下,使用"r"或"rt"方式打开文件时,该结果可能不对。

因为在这种情况下,代表是文本方式。而windows下文本方式换行为\n\r。在读取文件时,windows下的fgets会把这两个字符合并成\n一个字符。

这样在文本文件含有换行时,结果就不准确了。


3 综上,获取文件大小的时候用第一种方法更好。一方面绝对准确,另一方面,效率也更高一些。

第2个回答  2015-12-12
直接新建两个文件指针即可,理论上按照这样的方法是可以读取任意个文件的。数量并不受到硬件上的限制。
具体操作的代码如下:
#include <stdio.h>
void main()
{
int a,b,c;
FILE *fp1,*fp2;
if(((fp1=fopen("c:\date1.txt","r"))==NULL)||((fp2=fopen("c:\date2.txt","r"))==NULL))
{
printf("the file can not open!\n");
return;
}
fclose(fp1);
fclose(fp2);
}
请注意,在读取文件时,要验证是否成功读入,也要记得关闭文件流。以免造成不必要的错误。
第3个回答  2015-11-24
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void main()
{
FILE *p=fopen("d:\\jiuibf.txt","rt");
int length = 0;
for(;fgetc(p)!=EOF;length++);
fclose(p);
printf("第一种方式,文件长度=%d\n",length);
p=fopen("d:\\jiuibf.txt","rb");
fseek(p,0,2);
length=ftell(p);
fclose(p);
printf("第二种方式,文件长度=%d\n",length);
}
相似回答