C语言读txt文件,末尾多读出一个字符

我写的一个读文件中字符进行操作的函数,但是读取后末尾总会多读出一个,比如txt中有1234567,读出后却是12345677.好象是在while语句的条件中要加一个,但是... 我写的一个读文件中字符进行操作的函数,但是读取后末尾总会多读出一个,比如txt中有1234567,读出后却是12345677.好象是在while语句的条件中要加一个,但是我不知道,希望前辈指点.
还有就是M=(((float)c1*2/256)-1)这一行中的强制转换不知道会不会造成什么错误,因为生成新文件后我还得再读回来用M=M/trs和c1=(char)((M+1)*128)还原.
注:trs是主函数传进来的[-1,1]的小数

void encryption(float trs)
{
char fn[256],fn1[256];
unsigned char c1;
FILE *fp,*fp1;
float M;
printf("输入需要加密的文件名:");
scanf("%s",fn);
if(fopen (fn,"r")==NULL)
{
printf ("文件不存在或路径错误!\n");
exit(0);
}
fp=fopen(fn,"r");
printf("\n\n输入密文的文件名:");
scanf("%s",fn1);
fp1=fopen(fn1,"w");

while(!feof(fp))
{
fscanf(fp,"%c",&c1);
printf("%c",c1);
M=(((float)c1*2/256)-1); //将消息表达为一个数[-1,1]
M=M*trs;
fprintf(fp1,"%.20f\n",M);
}
fclose(fp);
fclose(fp1);

}
展开
 我来答
L_o_o_n_i_e
2008-06-06 · TA获得超过4.2万个赞
知道大有可为答主
回答量:8507
采纳率:38%
帮助的人:5184万
展开全部
问题在:
while(!feof(fp)) {}
EOF 的测定,只有在fscanf读到EOF后 才知道。
所以 while 最后一次循环中多做了一次fscanf后面的所有语句。


fscanf(fp,"%c",&c1);

if ( fscanf(fp,"%c",&c1) ==EOF) break;
就可跳出循环体。
星月小木木
2016-01-15 · TA获得超过3.2万个赞
知道大有可为答主
回答量:2.4万
采纳率:0%
帮助的人:9832万
展开全部
可以使用输入输出重定向来将TXT文本中的字符内容导入程序中,或者使用标准C库函数:fopen()和fgetc();
先使用fopen()函数打开TXT文本文件,然后使用fgetc读取文本文件中的字符。读取全部文本中全部字符可以使用一个while循环加判断是否读取到文件结尾来实现:
char ch;
while((ch= fgetc(fp)) != EOF)

这样当读取到文件结尾时,while循环就会终止。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
403259982
2008-06-06
知道答主
回答量:24
采纳率:0%
帮助的人:27.7万
展开全部
fp=fopen(fn,"r");
if(fopen (fn,"r")==NULL)
{
printf ("文件不存在或路径错误!\n");
exit(0);
}
else
{
while(fscanf(fp,"%c",&c1)!=EOF)
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式