C语言,往文件中写入数据的问题

运行时,读取一个文件的内容(如1.txt),写入另一个文件(如2.txt),结果会发现2.txt中,在结尾会多出一个未知字符。请问,这是怎么回事?
还有就是,为什么第一次输入文件名时,要在后面跟一句getchar()来接受回车符(如果不写,则输出文件的第一行会空一行),而第二次则不需要?
程序如下:
/* 用fopen函数向文件输入内容,以#结尾*/
#include<stdio.h>
#include<stdlib.h>
void main()
{
FILE *fp,*in,*out;
char ch,filename[10],outfile[10];
printf("请输入所用的文件名:\n");
scanf("%s",filename);
/*if((fp=fopen(filename,"w"))==NULL) 无需进行判断,因为若所用文件不存在,则会创建新的文件
{
printf("无法打开此文件\n");
exit(0);
}*/
fp=fopen(filename,"w");/* w左右必须有双引号,否则报错 */
ch=getchar();/*此句用来接受在执行scanf语句时最后输入的回车符,若不加此句,则在存储文件中,第一行会空一行*/
printf("请输入一个准备存储到磁盘的字符串,以#结束:\n");
ch=getchar();
while(ch!='#')
{
fputc(ch,fp);
putchar(ch);
ch=getchar();
}
fclose(fp); //去掉此句,运行结果也没有变化,为什么?
putchar(10);
in=fopen(filename,"r");
printf("请输入要输出的文件名:\n");
scanf("%s",outfile);
out=fopen(outfile,"w");
//ch=getchar(); 此句为何可以不写也不会在文件第一行有空行,而第一个语句不写,则会出现空行?
while(!feof(in)) /*如果未遇到输入文件的结束标志*/
{
ch=fgetc(in);
fputc(ch,out);
putchar(ch);
}
putchar(10);
fclose(in);
fclose(out);
}
谢谢,请问,EOF可不可以不接受呢?如果不想将EOF写入2.txt,程序应如何修改?

fclose(fp):函数fclose()关闭给出的文件流, 释放已关联到流的所有缓冲区. fclose()执行成功时返回0,否则返回EOF.
加上这一句是为了保护你的文件 如果不写这句 那么别的程序也可以随意的对该文件进行写入 这样你的文件就是乱套了。
首先楼主要搞清楚getchar()是什么意思
getchar() 相当于 getc(stdin)也就是从stdin缓冲流里面读数据 你写这句也是为了防止你输入字符后后面还有残余
但是第二个是读文件数据流 根本就没有读缓冲流 所以不写那句也可以的。
没有弄明白什么是EOF EOF常被作为文件结束的标志。EOF 的值通常为 -1
它不是字符串 他相当于宏定义 它是不会被写入到文件当中的
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-12-03
fclose(fp):函数fclose()关闭给出的文件流, 释放已关联到流的所有缓冲区. fclose()执行成功时返回0,否则返回EOF.
加上这一句是为了保护你的文件 如果不写这句 那么别的程序也可以随意的对该文件进行写入 这样你的文件就是乱套了。
首先楼主要搞清楚getchar()是什么意思
getchar() 相当于 getc(stdin)也就是从stdin缓冲流里面读数据 你写这句也是为了防止你输入字符后后面还有残余
但是你第二个是读文件数据流 根本就没有读缓冲流 所以不写那句也可以的
不知道楼主明白否?

补充回答:
楼主没有弄明白什么是EOF EOF常被作为文件结束的标志。EOF 的值通常为 -1
它不是字符串 他相当于宏定义 它是不会被写入到文件当中的

如楼主还有疑问 直接hi我吧本回答被提问者和网友采纳
第2个回答  2010-12-01
1.在你输入东西的时候,输入的东西连同敲入的回车'\n'一起送入缓冲区。
东西被取走了,'\n'留在缓冲区,必须由getchar()函数取走。
否则,'\n'连同写入的数据一起送入2.txt
2.那是文件结束符EOF