对文件操作的一个小疑问!

ImAmelie 2014-07-08 04:22:29

#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *in, *out;
char ch, infile[10], outfile[10];
printf("输入读入文件的名字:");
scanf("%s", infile);
printf("输入输出文件的名字:");
scanf("%s", outfile);
if ((in = fopen(infile, "r")) == NULL)
{
printf("无法打开此文件\n");
exit(0);
}
if ((out = fopen(outfile, "w")) == NULL)
{
printf("无法打开此文件\n");
exit(0);
}
while (!feof(in))
{
ch = fgetc(in);
fputc(ch, out);
putchar(ch);
}
putchar(10);
fclose(in);
fclose(out);
return 0;
}

两个文件分别是
file1.dat
file2.dat
file1.dat里面的内容是

computer and c

一共14个字符 file1.dat这个文件占14个字节


我的疑问是 为什么file2.dat占15个字节,内容里最后还有个字符,好像是空格,也好想是全角空格,又或者是别的!
...全文
235 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2014-07-10
  • 打赏
  • 举报
回复
果然如此,多谢楼上指正
endeavourken 2014-07-09
  • 打赏
  • 举报
回复
楼主确定file1.dat只有14个字符吗? 我做一个file1.dat文件后,显示大小为15个字符,说明结尾有个EOF字符。 EOF字符的整数值为-1,所以在用char来显示时会是个奇怪的图形(ASCII码,不要忘记,规定的是0~127的对应字符,-1没有对应字符)
ImAmelie 2014-07-09
  • 打赏
  • 举报
回复
EOF是文本文件的结束标志 可是我的file1.dat文件里并没有EOF啊?

computer and c
总共14个字符,文件只有14个字节? 那EOF在哪里呢? 程序是怎么找到EOF的呢?这个有点不明白,百科搜EOF也没有答案。。。
引用 1 楼 zhao4zhong1 的回复:
引用 4 楼 u010882724 的回复:
引用 5 楼 zjq9931 的回复:
赵4老师 2014-07-09
  • 打赏
  • 举报
回复
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
  • 打赏
  • 举报
回复
如果文件中存在一个字节是0xff,那么用下面的程序,iIn接收fgetc的返回值,和用cIn接收fgetc输出的结果是不同的。 用iIn接收,可以读取完整的文件,用cIn接收,只能读取到文件中的0xff处。

#include<stdio.h>
int main()
{
	FILE *pflIn;
	char cIn;
	int iIn;
	pflIn = fopen("f:\\b.txt", "rb");
	if(pflIn == NULL)
	{
		puts("sdfsdfds");
		return 0;
	}
	cIn = fgetc(pflIn);
	while (cIn!=EOF)
	{
		printf("%d\n", cIn);
		cIn = fgetc(pflIn);
	}
	printf("%d\n", EOF);
	return 0;
}
引用 8 楼 u013491662 的回复:
EOF是文本文件的结束标志 可是我的file1.dat文件里并没有EOF啊?

computer and c
总共14个字符,文件只有14个字节? 那EOF在哪里呢? 程序是怎么找到EOF的呢?这个有点不明白,百科搜EOF也没有答案。。。 [quote=引用 1 楼 zhao4zhong1 的回复:]
引用 4 楼 u010882724 的回复:
引用 5 楼 zjq9931 的回复:
[/quote]
引用 8 楼 u013491662 的回复:
EOF是文本文件的结束标志 可是我的file1.dat文件里并没有EOF啊?

computer and c
总共14个字符,文件只有14个字节? 那EOF在哪里呢? 程序是怎么找到EOF的呢?这个有点不明白,百科搜EOF也没有答案。。。 [quote=引用 1 楼 zhao4zhong1 的回复:]
引用 4 楼 u010882724 的回复:
引用 5 楼 zjq9931 的回复:
[/quote]
mujiok2003 2014-07-09
  • 打赏
  • 举报
回复
while (!feof(in))
    {
        ch = fgetc(in);
        fputc(ch, out);
        putchar(ch);
    }
当读出最后一个字节时,feof(in) == 0, 接着又进入while ch = fgetc(in);之后, feof(in) != 0了, 之后便该跳出循环了。

   for(;;)
    {
        ch = fgetc(in);
        if(feof(in))
        {
           break;
        }
        fputc(ch, out);
        putchar(ch);
    }
  • 打赏
  • 举报
回复
注意如果用EOF判断,因为EOF是-1,而不是用feof()这个函数来判断,那么,接收fgetc函数返回值的必须是int型,不能是char型。因为文件中可能存在char型的-1,如果是文件中的-1字符(0xff),用char型的接收,就后有问题了。int型的-1是0xffffffff
引用 8 楼 u013491662 的回复:
EOF是文本文件的结束标志 可是我的file1.dat文件里并没有EOF啊?

computer and c
总共14个字符,文件只有14个字节? 那EOF在哪里呢? 程序是怎么找到EOF的呢?这个有点不明白,百科搜EOF也没有答案。。。 [quote=引用 1 楼 zhao4zhong1 的回复:]
引用 4 楼 u010882724 的回复:
引用 5 楼 zjq9931 的回复:
[/quote]
初見的畫面 2014-07-09
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
 if (条件1) break;
 //...
 if (条件2) continue;
 //...
 if (条件3) return;
 //...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
while (!feof(f)) {
 a=fgetc(f);
 //...
 b=fgetc(f);//可能此时已经feof了!
 //...
}
而这样写就没有问题:
while (1) {
 a=fgetc(f);
 if (feof(f)) break;
 //...
 b=fgetc(f);
 if (feof(f)) break;
 //...
}
类似的例子还可以举很多。
  • 打赏
  • 举报
回复
EOF是,文件读取函数的返回值。并没有在文件里面存着。是文件读取函数根据系统的文件结构来的。
引用 8 楼 u013491662 的回复:
EOF是文本文件的结束标志 可是我的file1.dat文件里并没有EOF啊?

computer and c
总共14个字符,文件只有14个字节? 那EOF在哪里呢? 程序是怎么找到EOF的呢?这个有点不明白,百科搜EOF也没有答案。。。 [quote=引用 1 楼 zhao4zhong1 的回复:]
引用 4 楼 u010882724 的回复:
引用 5 楼 zjq9931 的回复:
[/quote]
赵4老师 2014-07-09
  • 打赏
  • 举报
回复
引用 17 楼 taiyang_1435586562 的回复:
在对文件操作时,我也遇到过这样的问题,我是这样解决的: ch=fgetc(in); putchar(ch); fputc(ch,out); while(!feof(fp)) { ch=fgetc(in); putchar(ch); fputc(ch,out); }
这段代码操作长度为0的文件时会出问题。
「已注销」 2014-07-09
  • 打赏
  • 举报
回复
在对文件操作时,我也遇到过这样的问题,我是这样解决的: ch=fgetc(in); putchar(ch); fputc(ch,out); while(!feof(fp)) { ch=fgetc(in); putchar(ch); fputc(ch,out); }
ImAmelie 2014-07-09
  • 打赏
  • 举报
回复


引用 9 楼 endeavourken 的回复:
楼主确定file1.dat只有14个字符吗?
我做一个file1.dat文件后,显示大小为15个字符,说明结尾有个EOF字符。
EOF字符的整数值为-1,所以在用char来显示时会是个奇怪的图形(ASCII码,不要忘记,规定的是0~127的对应字符,-1没有对应字符)
ImAmelie 2014-07-08
  • 打赏
  • 举报
回复
引用 2 楼 wu424602394 的回复:
听说feof()就是有这个问题,读到-1后不立即结束,还要多读一次.....那个符号就是 -1 吧,你调试下看看你while(!feof(in))里面是不是执行了15次
EOF是文本文件的结束标志 可是我的file1.dat文件里并没有EOF啊?

computer and c
总共14个字符,文件只有14个字节? 哪EOF在哪里呢? 程序是怎么找到EOF的呢?这个有点不明白,百科搜EOF也没有答案。。。
  • 打赏
  • 举报
回复
引用 楼主 u013491662 的回复:
两个文件分别是 file1.dat file2.dat file1.dat里面的内容是 一共14个字符 file1.dat这个文件占14个字节 我的疑问是 为什么file2.dat占15个字节,内容里最后还有个字符,好像是空格,也好想是全角空格,又或者是别的!
读写文件的过程改成这样就可以了。

ch = fgetc(in);
while (!feof(in))
    {
        fputc(ch, out);
        putchar(ch);
        ch = fgetc(in);//读取之后判断,是否文件结束,如果是结束,就不用写出了。
    }
Spirit_信徒 2014-07-08
  • 打赏
  • 举报
回复
楼主可以去看一下百科的解释,里面详细说明了这个问题的原因、、、 http://baike.baidu.com/link?url=caxKNmCIhaGoPS-74dO4_GOIiTO74I_rDvSUdJv1luF0SjZCjNabyJqd0F2dBT1a
赵4老师 2014-07-08
  • 打赏
  • 举报
回复
在没进行任何读操作之前是不可能feof的。
wu424602394 2014-07-08
  • 打赏
  • 举报
回复
听说feof()就是有这个问题,读到-1后不立即结束,还要多读一次.....那个符号就是 -1 吧,你调试下看看你while(!feof(in))里面是不是执行了15次
赵4老师 2014-07-08
  • 打赏
  • 举报
回复
不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
 if (条件1) break;
 //...
 if (条件2) continue;
 //...
 if (条件3) return;
 //...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
while (!feof(f)) {
 a=fgetc(f);
 //...
 b=fgetc(f);//可能此时已经feof了!
 //...
}
而这样写就没有问题:
while (1) {
 a=fgetc(f);
 if (feof(f)) break;
 //...
 b=fgetc(f);
 if (feof(f)) break;
 //...
}
类似的例子还可以举很多。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧