:从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件中保存。 输入字符以!结

2024-11-03 00:20:09
推荐回答(3个)
回答1:

#include
#include
int main()
{
char ch;
int a=0;
FILE *pfile=NULL;
char filename[20];
printf("Please input a filename:");
gets(filename);/*这里输入文件名时,最好在末尾加上.txt 方便退出程序后查看*/
if(!(pfile=fopen(filename,"w")))
{
printf("I can't open the file!");
exit(1);
}
printf("enter the char\n");
ch=getchar();
while(ch!='q') /*用q来跳出循环比较方便*/
{
fputc(toupper(ch),pfile);
putchar(toupper(ch));/*不明白这里为什么不是输入一个字符就立刻输出而是等到按下回车才全部一起输出!!! */
scanf("%c",&ch); /*经测试,输入一个字符输出对应的大写*/
}
fclose(pfile);
pfile=fopen(filename,"r");
rewind(pfile);{a++;}/*为什么这里用rewind()回到文件的 开头后运行是错的*/
printf("%d\n\n",a); /*这里的a只是测试之用,可知这里没有错误*/
ch=fgetc(pfile);
while(ch!=EOF)
{
printf("%c",ch);
ch=fgetc(pfile);
}
printf("the end of programing!\nenter any key to continue...");
getch();
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
代码如下:
#include
#include
int main()
{
char ch;
FILE *pfile=NULL;
char filename[20];
printf("Please input a filename:");
gets(filename);
if(!(pfile=fopen(filename,"w")))
{
printf("I can't open the file!");
exit(1);
}
printf("enter the char\n");
ch=getchar();
while(ch!='q')
{
fputc(toupper(ch),pfile);
putchar(toupper(ch));
scanf("%c",&ch);
}
fclose(pfile);
pfile=fopen(filename,"r");
rewind(pfile);
ch=fgetc(pfile);
while(ch!=EOF)
{
printf("%c",ch);
ch=fgetc(pfile);
}
printf("the end of programing!\nenter any key to continue...");
getch();
}

回答2:

;"
上面这句话应该不对吧?小写字母全部转换成大写字母就是对应ASCII码减32,你这个'z'-'a'的值是25.
另外赞同楼上说的“还可以按照常识,比如操作文本文件都用ascii,对于二进制文件,用二进制。 ”但这不是绝对的,文本文件用ascii,主要是这些信息本来就是以自然文本的形式表达,你用记事本打开这些ASCII码存储的文本,一目了然知道了想要反应的信息。如果按照二进制的方式读写这些本来要用ASCII码表达的东西,用记事本打开就只能看到乱码。但并不是说以二进制操作就不能正确获取内容。用二进制操作文本文件通常比用ASCII方式生成的文件要小得多。

回答3:

//////////////////////////////////////问题引用///////////////////////////////////////////
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)+换行)