贴上程序
九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。 -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。 -毛泽东
验证字符流是不是只能处理ascii码的问题??
程序如下:
#include <stdio.h>
void main(void)
{
FILE *fpr,*fpw;
char c;
//test1.tet中只有两个字符01
fpr=fopen(".\\test1.txt","r");
fpw=fopen(".\\test2.txt","w");
printf("start\n");
for(;;)
{
c=fgetc(fpr);
if(c==EOF)
break;
else
switch(c)
{
case 0x30:{c=0xf0;fputc(c,fpw);break;}//在这里发生超出ascii码的表示字符
case 0x31:{c=0x41;fputc(c,fpw);break;}//这里是ascii码的表示字符
}
}
fcloseall();
//下面让我们来看看test2中的内容
fpr=fopen(".\\test2.txt","r");
for(;;)
{
c=fgetc(fpr);
if(c==EOF)
break;
else
{
fputc(c,stdout);
printf(" %d\n",c);
}
}
printf("\ndone\n");
fcloseall();
return;
}
输出结果为:
start
?-16
A 65
Done
看来字节流的处理函数可以处理非ascii码!!亦或者可以处理
任何字符(以上的都是带符号的字符)
我的猜想错了。那么以有可能使你的程序范了一个错误!!
就是ch的值如果为-1即0xFF的时候。他是一个字符流结束的标志。而你把他编入了一个case:(你说你有0-255的case分支)如果你转换它为其他的值,那么必然,有一个ch=0xXX的值被转换为0xFF了。但是这个值后面的值尽管转换的时候不会发生错误,但是你逆转的时候,如果使用字符流的形式的话。那么这个0xFF将成为你文件结束的标志。也就是说虽然后面还有需要转换的值但是你的字符流文件已经结束了。
看看这个程序:
#include <stdio.h>
void main(void)
{
FILE *fpr;
char c;
int n=0;
//test1.txt中只有两个字符01
fpr=fopen(".\\test1.txt","r");
printf("TEST\n");
for(n=0;n<10;n++)
{
c=fgetc(fpr);
fputc(c,stdout);
}
printf("||c=%d\n",c);
fcloseall();
}
猜猜输出会是什么,就是c会取些是什么值:
结果是
TEST
01
刚才又调了一个一个程序发现一些问题:上面我写的可能有很多错误!!渴望高手能指点!!
#include <stdio.h> void main(void) { FILE *fpr,*fpw; char c; int n=0;
fpw=fopen(".\\test1.txt","wb");
for(n=0;n<2;n++) { c=n+'0'; fwrite(&c,sizeof(char),1,fpw); } fflush(NULL); fcloseall();
fpr=fopen(".\\test1.txt","rb");//test1.tet中只有两个字符01 if(ferror(fpr)) printf("\nerro\n");
//test1.txt中字符使用二进制流的读取 fpr=fopen(".\\test1.txt","rb"); printf("\nTEST 二进制流\n"); for(;;) { if(!feof(fpr)) { fread(&c,sizeof(char),1,fpr); printf("%c",c); } else break; } printf("||c=%d\n",c); fclose(fpr);
//test2.txt中字符使用字符流的读取 fpr=fopen(".\\test1.txt","r"); printf("\nTEST 字符流\n"); for(;;) { c=fgetc(fpr); if(ferror(fpr)) printf("|true3|"); if(c==EOF) break; else { fputc(c,stdout); if(ferror(fpr)) printf("|true4|"); } } printf("||c=%d\n",c); fclose(fpr); } 为什么输出会是