专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > C语言

这样做为什么得不到文件的大小?解决方法

发布时间:2011-06-28 16:13:10 文章来源:www.iduyao.cn 采编人员:星星草
这样做为什么得不到文件的大小?
int   i=0;
int   FileLength=0;

//获取文件长度
fseek(fileIn,0,SEEK_END);
FileLength=ftell(fileIn);

//回到文件开始
fseek(fileIn,0,SEEK_SET);

//放入缓冲区
body=(char*)malloc(FileLength);
*body=(char)fgetc(fileIn);
while(*body!=EOF   &   feof(fileIn)==0){
fputc(*body,fileOut);
body++;
*body=(char)fgetc(fileIn);
i++;
}

FileLength的值是120,但我用上面的i进行跟踪,最后却发现i是115,不知道为什么
应该是120次循环才对啊,
请高手教我!

------解决方案--------------------
不要用文本方式打开,用二进制方式打开文件试试看。
文本方式会特殊处理回车和换行。
------解决方案--------------------
1. 这个程序应该是个联系吧,一次从 file_in 读取一个字节,然后写入 file_out 效率太低了。如果是个实用程序用fread,fwrite ,也不需要计算文件的长度。

2。
| body=(char*)malloc(FileLength);
| ....
| body++;

你怎么再次访问你分配的内存,用 计数器i? 虽说可以,但极不方便。正确的做法是:
char *p = body,对p进行操作,这样你仍保留原始地址。

3. 切入正题。windows 操作系统把文件分为两类,文本文件和二进制文件。一个文本文件在文件末尾包含一个EOF表示文件结束,而二进制文件本省就可能包含EOF标志,实际上并没有结束。所以你用 fgetc(file)!=EOF来判断二进制文件可能会出现错误的结果。判断二进制结尾的方法是feof(file)。

> > while(*body!=EOF & feof(fileIn)==0){
1) & 是位与运算 && 才是 and 的意思。
2) 对二进制文件用 *body!= EOF 判断不行;

用feof()进行判断文件结尾的时候要小心,因为只有越界的时候函数才返回1,到了最后一个字节,它还是返回0,如果用
while(!feof(file)){
fputc....
}
会在目标文件中多写入一个字节(EOF标志).

------解决方案--------------------
给你一个实现作为参考。仅供学习 feof, fgetc, fputc .用这个方法复制文件效率太低了。

int copy(FILE *in, FILE *out)
{
int total_bytes = 0 ;
char ch;

while(1) {
ch = fgetc(in);
if (!feof(in)) {
fputc(ch, out);
total_bytes++;
}
else
break;
}
return total_bytes ;
}


int main(int argc, char *argv[])
{
FILE *in, *out ;

int n;

if (argc < 3) {
printf( "Usage: %s <source file> <target file> \n ",argv[0]);
return 1;
}

if ( (in = fopen(argv[1], "rb ")) == NULL) {
printf( "Fail to open source file %s\n ", argv[1]);
return 1;
}

if ( (out = fopen(argv[2], "w+b "))== NULL) {
printf( "Fail to create target file %s\n ", argv[2]);
return 1;
}

n = copy(in, out);

printf( "total %d bytes copied\n ",n);

fclose(in);
fclose(out);

}
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: