方法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>文本文件的内容是:
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;棒棒哒
移动到文件尾后,使用ftell获取到文件大小值的方法是正确的。
要获取文件大小,有两种可行的方法。
1 将文件指针移动到文件尾,并通过ftell获取到结果。
fseek(fp, 0, SEEK_END);这种方法得到的是绝对准确的值。因为ftell返回的就是文件指针对文件头的偏移量,单位为字节。
2 将文件依次读取,直到文件结尾。统计实际读取到的字符个数。
int size = 0;程序运行后的size值即为文件大小。
这种方法是不一定准确的。要依赖一些因素。当在非windows环境下,该方法准确。
当打开文件方式为"rb"时,该方法也准确。
但当windows下,使用"r"或"rt"方式打开文件时,该结果可能不对。
因为在这种情况下,代表是文本方式。而windows下文本方式换行为\n\r。在读取文件时,windows下的fgets会把这两个字符合并成\n一个字符。
这样在文本文件含有换行时,结果就不准确了。
3 综上,获取文件大小的时候用第一种方法更好。一方面绝对准确,另一方面,效率也更高一些。