程序片断:
//创建in文件并写入数据
int main(int argc, char* argv[])
{
FILE *fp;
char ch;
if((fp=fopen("c:\\in","wt"))==NULL)
{
printf("cannot open the file\n");
exit(0);
}
//else printf("can open the file\n");
ch=getchar();
while(ch!='#')
{
fputc(ch,fp);
putchar(ch);
ch=getchar();
}
fclose(fp);
return 0;
}
//复制in文件到out文件中
int main(int argc, char* argv[])
{
FILE *fp1,*fp2;
char ch;
int i;
if((fp1=fopen("c:\\in","rb"))==NULL)
{
printf("1 cannot open file\n");
//exit(1);
}
else if((fp2=fopen("c:\\outdata","wb"))==NULL)
{
printf("2 cannot open file\n");
exit(0);
}
else
{
while(!feof(fp1))
{
ch=fgetc(fp1);
fputc(ch,fp2);
putchar(ch);
}
fclose(fp1);
fclose(fp2);
}
return 0;
}
13 个解决方案
#1
文本文件最后有一个Ctrl-Z结束符
#2
if((fp=fopen("c:\\in","wt"))==NULL
这里是用文本方式打开in文件的
if((fp1=fopen("c:\\in","rb"))==NULL)
else if((fp2=fopen("c:\\outdata","wb"))==NULL)
这里是用二进制方式打开in的
问题应该和这个有关
#3
我把“wt”改成“wb”还是有一样得问题啊,怎么解决啊
#4
仔细试了试,是feof()函数的问题
while(!feof(fp1))
{
ch=fgetc(fp1);
fputc(ch,fp2);
putchar(ch);
}
当fp1指向文件结束时,还要循环一次。
如文件内容为"this"
上述循环要进行5次,即把文件结束符写入到outdata文件中去了。
此时复制的文件中多了一个'\FF'的字符。是不是此函数的一个BUG
即移动文件尾后,还要移动一下,feof()才会逻辑真????
这个问题不仅在二进制方式中有,在文本方式中也有。
我两种方式都试了。
/*复制in文件到out文件中*/
#include <stdio.h>
int main(int argc, char* argv[])
{
FILE *fp1,*fp2;
char ch;
int i=0;
if((fp1=fopen("d:\\in","rt"))==NULL)
{
printf("1 cannot open file\n");
exit(1);
}
else if((fp2=fopen("d:\\outdata","wt"))==NULL)//改了一下文件的盘号
{
printf("2 cannot open file\n");
exit(0);
}
else
{
while(!feof(fp1))
{
ch=fgetc(fp1);
fputc(ch,fp2);
putchar(ch);
i++;
}
fclose(fp1);
fclose(fp2);
printf("%d\n",i);
}
return 0;
}
while(!feof(fp1))
{
ch=fgetc(fp1);
fputc(ch,fp2);
putchar(ch);
}
当fp1指向文件结束时,还要循环一次。
如文件内容为"this"
上述循环要进行5次,即把文件结束符写入到outdata文件中去了。
此时复制的文件中多了一个'\FF'的字符。是不是此函数的一个BUG
即移动文件尾后,还要移动一下,feof()才会逻辑真????
这个问题不仅在二进制方式中有,在文本方式中也有。
我两种方式都试了。
/*复制in文件到out文件中*/
#include <stdio.h>
int main(int argc, char* argv[])
{
FILE *fp1,*fp2;
char ch;
int i=0;
if((fp1=fopen("d:\\in","rt"))==NULL)
{
printf("1 cannot open file\n");
exit(1);
}
else if((fp2=fopen("d:\\outdata","wt"))==NULL)//改了一下文件的盘号
{
printf("2 cannot open file\n");
exit(0);
}
else
{
while(!feof(fp1))
{
ch=fgetc(fp1);
fputc(ch,fp2);
putchar(ch);
i++;
}
fclose(fp1);
fclose(fp2);
printf("%d\n",i);
}
return 0;
}
#5
写错了,此时复制的文件中多了一个'\FF'的字符----应该是'\xFF'
显示时是一个y上多两点的字符。
显示时是一个y上多两点的字符。
#6
当文件为空时同样有一个""y你可以复制在这上面看见是空不信你试
#7
实际上你已经完成了只是打开方式不对可以用写字扳打开
#8
那。。。。。。。。。
是。。。。。。。。。
feof()函数的问题???
是。。。。。。。。。
feof()函数的问题???
#9
#include <stdio.h>
void main()
{
FILE *fp;
fp=fopen("d:\\in.txt","w");
fclose(fp);
}
文件长度为0.再看下面的程序
#include <stdio.h>
void main()
{
FILE *fp;
fp=fopen("d:\\in.txt","w");
fclose(fp);
fp=fopen("d:\\in.txt","r");
if(!fp)
{
exit(0);
}
while(!feof(fp))
{
putchar(fgetc(fp));
}
fclose(fp);
}
还是输出一个字符,也就是要循环1次!!!
void main()
{
FILE *fp;
fp=fopen("d:\\in.txt","w");
fclose(fp);
}
文件长度为0.再看下面的程序
#include <stdio.h>
void main()
{
FILE *fp;
fp=fopen("d:\\in.txt","w");
fclose(fp);
fp=fopen("d:\\in.txt","r");
if(!fp)
{
exit(0);
}
while(!feof(fp))
{
putchar(fgetc(fp));
}
fclose(fp);
}
还是输出一个字符,也就是要循环1次!!!
#10
想了个办法,由于feof()函数移动到文件尾时还要再移动一下,才能返回真值,
1。打开文件
fp=fopen("d:\\in","rb");
if(!fp)
{
exit(0);
}
2。求出文件长度
fseek(fp,0L,SEEK_END);
n=ftell(fp);
rewind(fp);//再移到文件开头
3。用循环来控制是否读完所有文件的有效内容
for(i=0;i<n;i=i+(每次读文件的字节数))//要保证n可以整除(每次读文件的字节数)
{
读文件中若干字节数;
其他操作;
}
这样可以克服feof()的问题。
1。打开文件
fp=fopen("d:\\in","rb");
if(!fp)
{
exit(0);
}
2。求出文件长度
fseek(fp,0L,SEEK_END);
n=ftell(fp);
rewind(fp);//再移到文件开头
3。用循环来控制是否读完所有文件的有效内容
for(i=0;i<n;i=i+(每次读文件的字节数))//要保证n可以整除(每次读文件的字节数)
{
读文件中若干字节数;
其他操作;
}
这样可以克服feof()的问题。
#11
vmark
#12
精辟!
#13
用了以上得办法后问题解决了,多谢指点!
#1
文本文件最后有一个Ctrl-Z结束符
#2
if((fp=fopen("c:\\in","wt"))==NULL
这里是用文本方式打开in文件的
if((fp1=fopen("c:\\in","rb"))==NULL)
else if((fp2=fopen("c:\\outdata","wb"))==NULL)
这里是用二进制方式打开in的
问题应该和这个有关
#3
我把“wt”改成“wb”还是有一样得问题啊,怎么解决啊
#4
仔细试了试,是feof()函数的问题
while(!feof(fp1))
{
ch=fgetc(fp1);
fputc(ch,fp2);
putchar(ch);
}
当fp1指向文件结束时,还要循环一次。
如文件内容为"this"
上述循环要进行5次,即把文件结束符写入到outdata文件中去了。
此时复制的文件中多了一个'\FF'的字符。是不是此函数的一个BUG
即移动文件尾后,还要移动一下,feof()才会逻辑真????
这个问题不仅在二进制方式中有,在文本方式中也有。
我两种方式都试了。
/*复制in文件到out文件中*/
#include <stdio.h>
int main(int argc, char* argv[])
{
FILE *fp1,*fp2;
char ch;
int i=0;
if((fp1=fopen("d:\\in","rt"))==NULL)
{
printf("1 cannot open file\n");
exit(1);
}
else if((fp2=fopen("d:\\outdata","wt"))==NULL)//改了一下文件的盘号
{
printf("2 cannot open file\n");
exit(0);
}
else
{
while(!feof(fp1))
{
ch=fgetc(fp1);
fputc(ch,fp2);
putchar(ch);
i++;
}
fclose(fp1);
fclose(fp2);
printf("%d\n",i);
}
return 0;
}
while(!feof(fp1))
{
ch=fgetc(fp1);
fputc(ch,fp2);
putchar(ch);
}
当fp1指向文件结束时,还要循环一次。
如文件内容为"this"
上述循环要进行5次,即把文件结束符写入到outdata文件中去了。
此时复制的文件中多了一个'\FF'的字符。是不是此函数的一个BUG
即移动文件尾后,还要移动一下,feof()才会逻辑真????
这个问题不仅在二进制方式中有,在文本方式中也有。
我两种方式都试了。
/*复制in文件到out文件中*/
#include <stdio.h>
int main(int argc, char* argv[])
{
FILE *fp1,*fp2;
char ch;
int i=0;
if((fp1=fopen("d:\\in","rt"))==NULL)
{
printf("1 cannot open file\n");
exit(1);
}
else if((fp2=fopen("d:\\outdata","wt"))==NULL)//改了一下文件的盘号
{
printf("2 cannot open file\n");
exit(0);
}
else
{
while(!feof(fp1))
{
ch=fgetc(fp1);
fputc(ch,fp2);
putchar(ch);
i++;
}
fclose(fp1);
fclose(fp2);
printf("%d\n",i);
}
return 0;
}
#5
写错了,此时复制的文件中多了一个'\FF'的字符----应该是'\xFF'
显示时是一个y上多两点的字符。
显示时是一个y上多两点的字符。
#6
当文件为空时同样有一个""y你可以复制在这上面看见是空不信你试
#7
实际上你已经完成了只是打开方式不对可以用写字扳打开
#8
那。。。。。。。。。
是。。。。。。。。。
feof()函数的问题???
是。。。。。。。。。
feof()函数的问题???
#9
#include <stdio.h>
void main()
{
FILE *fp;
fp=fopen("d:\\in.txt","w");
fclose(fp);
}
文件长度为0.再看下面的程序
#include <stdio.h>
void main()
{
FILE *fp;
fp=fopen("d:\\in.txt","w");
fclose(fp);
fp=fopen("d:\\in.txt","r");
if(!fp)
{
exit(0);
}
while(!feof(fp))
{
putchar(fgetc(fp));
}
fclose(fp);
}
还是输出一个字符,也就是要循环1次!!!
void main()
{
FILE *fp;
fp=fopen("d:\\in.txt","w");
fclose(fp);
}
文件长度为0.再看下面的程序
#include <stdio.h>
void main()
{
FILE *fp;
fp=fopen("d:\\in.txt","w");
fclose(fp);
fp=fopen("d:\\in.txt","r");
if(!fp)
{
exit(0);
}
while(!feof(fp))
{
putchar(fgetc(fp));
}
fclose(fp);
}
还是输出一个字符,也就是要循环1次!!!
#10
想了个办法,由于feof()函数移动到文件尾时还要再移动一下,才能返回真值,
1。打开文件
fp=fopen("d:\\in","rb");
if(!fp)
{
exit(0);
}
2。求出文件长度
fseek(fp,0L,SEEK_END);
n=ftell(fp);
rewind(fp);//再移到文件开头
3。用循环来控制是否读完所有文件的有效内容
for(i=0;i<n;i=i+(每次读文件的字节数))//要保证n可以整除(每次读文件的字节数)
{
读文件中若干字节数;
其他操作;
}
这样可以克服feof()的问题。
1。打开文件
fp=fopen("d:\\in","rb");
if(!fp)
{
exit(0);
}
2。求出文件长度
fseek(fp,0L,SEEK_END);
n=ftell(fp);
rewind(fp);//再移到文件开头
3。用循环来控制是否读完所有文件的有效内容
for(i=0;i<n;i=i+(每次读文件的字节数))//要保证n可以整除(每次读文件的字节数)
{
读文件中若干字节数;
其他操作;
}
这样可以克服feof()的问题。
#11
vmark
#12
精辟!
#13
用了以上得办法后问题解决了,多谢指点!