,从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件"

如题所述

第1个回答  2020-01-18
//////////////////////////////////////问题引用///////////////////////////////////////////
ch=getchar();
while(ch!='!')
{
fputc(toupper(ch),pfile);
//putchar(toupper(ch));//不明白这里为什么不是输入一个字符就立刻输出而是等到按下回车才全部一起输出!!!
ch=getchar();
}
///////////////////////////////回答/////////////////////////////////
用getchar();时,在键盘上按一个字符后,要按回车才能读取进去,问题不出在putchar()上。
getchar();的用途是从从标准输入流读取一个字符,读回车符时退出。getchar();永远只向缓存中输入一个字符。
用getchar();时,在键盘上按一个字符后,要按回车才能读取进去;用getch();时,在键盘上按一个字符马上就被读取进去,不用按回车,因此可以作为“按任意键继续”的执行语句。
看下面的修改:(但有无回显的问题)
ch=getch();
while(ch!='!')
{
fputc(toupper(ch),pfile);
//putchar(toupper(ch));
ch=getchar();
//但是windows下getch()读取回车换行时
不读入换行符号
//结果输入回车换行时,仅仅回到行首
}
///////////////////////////////////////////////////////
getch()是从键盘接受一个无回显(屏幕看不见输入字符,就是没有输出到显示设备),不缓冲的输入,并返回对应按键的字符
一般用于等待一个输入,让屏幕暂停一下,方便看程序执行的结果
///////////////////////////////////////////////////////
修改一下,看详细结果:
必须读一次
就do-while
算了
do{
ch=getch();//ar();
fputc(toupper(ch),pfile);
fflush(pfile);
//为看结果立即刷新缓冲区
printf("\nnote:
char(ch)=");
//提示=号后面是结果
putchar(toupper(ch));
//输出getch()读入的字符
printf("\nnote:
int(ch)=%d:",ch);
//看读入字符c的ascii码
printf("\nnote:
'\\n'=%d:\n",'\n');
//看'\n'的ascii码
}
while(ch!='!');
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
flcose(pfile);
//增加
关闭文件后,自动刷新缓冲区
没有可读写时的刷新问题
pfile=fopen(filename,"r");
上面两句保留(不注释)应该没有问题,你的第二个问题,可能如下:
rewind(pfile);//为什么这里用rewind()回到文件的
开头后运行是错的?????
//你开始打开的是只写的文件,rewind()之后
仍然不能读的拉
//改法:或者打开为可读可写的,
或者关闭后重新打开来读
//当你用可读可写的方式打开时,rewind后可能也没有输出,需要刷新
//缓冲区fflush(pfile)的字符内容到文件后
再rewind才有内容可读
//方式:fflush(pfile);
rewind(pfile);
ch=fgetc(pfile);
while(ch!=eof)
{
printf("%c",ch);
fflush(stdout);
//刷新标准输出缓冲区
否则,缓冲区不满
不是必要
最后结束一样显示
//不会立即显示字符的(除了输出'\n'外)
ch=fgetc(pfile);
}
printf将"%c"输出到标准输出文件的缓冲区中(缓冲区在内存上),fflush(stdout)将缓冲区中的内容强制刷新到,并将其中的内容输出到显示器上("\n"回车换行
==
fflush(stdout)+换行)
相似回答