这样做为什么得不到文件的大小?解决方法
发布时间: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);
}
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。
其他相似内容:
-
【★C/C++奖励基金-30期★】更新获奖书籍,请选择~ - C/C++ / 非技术区
【★C/C++奖励基金-30期★】
C/C++ 2011-12专家榜
名次...
-
C/c++ 如何按位拷贝呢?
我有一个结构体
strut st_header
{
unsigned short ver:2
unsigned short ping:1
unsgne...
-
uboot上的一点代码,没看明白!
struct in_str {
const char *p;
#ifndef __U_BOOT__
char peek_buf[2];
#endif
int __promptme;
...
-
Debug时为什么变量的地址不变?
是巧合还是某种必然. 是不是因为C中生成的可执行程序存储的地址是相对地址而不是绝对的物理地址.
...
-
关于switch语句。我不知道哪里错了,大侠帮忙bug一下
#include <stdio.h>
int main()
{
int a;
char b;
do{
printf("1.Chines...
-
#pragma section 的 $ 语法
在 ARX 头文件中间过如下三行,放在一起:
#pragma section("ARXCOMMAND$__a")
#pragma section("ARXCOMM...
-
read 问题再现
#define N 205
signed short x[N];
for(i=0;i<N;i++)
{
printf("hello boy!!\n");
...
-
征求一个C语言输入函数?
不知道大家有没有学习过Java? 现在需要一个类似Java的Scanner的函数集, 要求如下:
1. 三个函数: int rea...
-
求一道算法。一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
/*我写了一点,但是有错误,汗*/
/*
...
-
3n+1问题
求救,不知道错在哪里
#include<stdio.h>
int count(int a,int b)
{
int max=0,len=0,a1;
while(a<=b)
{
...