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

来源:百度知道 编辑:UC知道 时间:2024/06/29 23:51:37
我写的一个读文件中字符进行操作的函数,但是读取后末尾总会多读出一个,比如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);

可以使用输入输出重定向来将TXT文本中的字符内容导入程序中,或者使用标准C库函数:fopen()和fgetc();
先使用fopen()函数打开TXT文本文件,然后使用fgetc读取文本文件中的字符。读取全部文本中全部字符可以使用一个while循环加判断是否读取到文件结尾来实现:
char ch;
while((ch= fgetc(fp)) != EOF)

这样当读取到文件结尾时,while循环就会终止。

问题在:
while(!feof(fp)) {}
EOF 的测定,只有在fscanf读到EOF后 才知道。
所以 while 最后一次循环中多做了一次fscanf后面的所有语句。


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

if ( fscanf(fp,"%c",&c1) ==EOF) break;
就可跳出循环体。

fp=fopen(fn,"r");
if(fopen (fn,"r")==NULL)
{
printf ("文件不存在或路径错误!\n");
exit(0);
}
else
{
while(fscanf(fp,"%c",&c1)!=EOF)
}