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

方法1:FILE*p=("jiuibf.txt","rt");intlength;for(;fgetc(p)!=EOF;length);方法2:FILE*p=(jiuib... 方法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大小。
展开
 我来答
xmcong2000
2015-01-10 · TA获得超过3471个赞
知道大有可为答主
回答量:1919
采纳率:0%
帮助的人:1334万
展开全部

我测试了你的代码:

#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就是文件的长度
追问
棒棒哒
嫑名字可以吗
2015-11-20 · TA获得超过389个赞
知道答主
回答量:90
采纳率:0%
帮助的人:8.4万
展开全部

移动到文件尾后,使用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 综上,获取文件大小的时候用第一种方法更好。一方面绝对准确,另一方面,效率也更高一些。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
团长你好吗
2015-12-12 · TA获得超过597个赞
知道小有建树答主
回答量:422
采纳率:20%
帮助的人:133万
展开全部
直接新建两个文件指针即可,理论上按照这样的方法是可以读取任意个文件的。数量并不受到硬件上的限制。
具体操作的代码如下:
#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);
}
请注意,在读取文件时,要验证是否成功读入,也要记得关闭文件流。以免造成不必要的错误。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
z15371992289
2015-11-24 · 超过54用户采纳过TA的回答
知道小有建树答主
回答量:142
采纳率:100%
帮助的人:18.3万
展开全部
#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);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式