当前位置: 技术问答>linux和unix
^_^一个经典的问题哦!
来源: 互联网 发布时间:2015-12-27
本文导语: 下面是我遇到的问题: 源程序如下:我的目的是把文件example.c的小写字母转换为大写字母 #include /*#include */ #include int main() { FILE * fp; char ch; fp=fopen("example.c","r+"); while((ch=fgetc(fp))!=EOF) { ...
下面是我遇到的问题:
源程序如下:我的目的是把文件example.c的小写字母转换为大写字母
#include
/*#include */
#include
int main()
{
FILE * fp;
char ch;
fp=fopen("example.c","r+");
while((ch=fgetc(fp))!=EOF)
{
if(islower(ch))
{
fseek(fp,-1L,1);
fputc(ch-32,fp);
}
}
fclose(fp);
getchar();
return 0;
}
我用Win-tc编译时,编译成功,执行结果只是把第一个小写变为大写,其余的没变,为什么?
我用MSVC++6.0编译,编译成功,执行结果是出现死循环,第一个小写字母的大写不停的写入文件里,为什么?
在Linux下用GCC编译,编译成功,执行结果与我想要的结果一致(全部小写变为大写。
为什么同样的源程序,用不同的编译器会有如此不同结果?
源程序如下:我的目的是把文件example.c的小写字母转换为大写字母
#include
/*#include */
#include
int main()
{
FILE * fp;
char ch;
fp=fopen("example.c","r+");
while((ch=fgetc(fp))!=EOF)
{
if(islower(ch))
{
fseek(fp,-1L,1);
fputc(ch-32,fp);
}
}
fclose(fp);
getchar();
return 0;
}
我用Win-tc编译时,编译成功,执行结果只是把第一个小写变为大写,其余的没变,为什么?
我用MSVC++6.0编译,编译成功,执行结果是出现死循环,第一个小写字母的大写不停的写入文件里,为什么?
在Linux下用GCC编译,编译成功,执行结果与我想要的结果一致(全部小写变为大写。
为什么同样的源程序,用不同的编译器会有如此不同结果?
|
while((ch=fgetc(fp))!=EOF)
{
if(islower(ch))
{
fseek(fp,-1L,1);
fputc(ch-32,fp);
}
}
改成如下内容:
while(1)
{
fflush(fp); //这句是关键
ch = fgetc(fp);
if (EOF == ch)
{
break;
}
if(islower(ch))
{
fseek(fp, -1L, 1);
fputc(ch - 32, fp);
}
}
问题解决。
与缓存模式有关。手上只有VC6,没MSDN,因此不知道VC和Windows的具体缓存模式是怎么样。假定example.c内容为abc,用VC调试的时候发现,每次写入fputc(ch - 32, fp)都写入了两个字符Bb,B覆盖当前字符,b覆盖下一字符,而ch读取到的总是'b'。当执行到文件尾时,每次EOF结束符都被b覆盖,导致死循环。
每次读取前如果fflush(fp)清除缓存,则一切正常(在Linux下也正常)。
{
if(islower(ch))
{
fseek(fp,-1L,1);
fputc(ch-32,fp);
}
}
改成如下内容:
while(1)
{
fflush(fp); //这句是关键
ch = fgetc(fp);
if (EOF == ch)
{
break;
}
if(islower(ch))
{
fseek(fp, -1L, 1);
fputc(ch - 32, fp);
}
}
问题解决。
与缓存模式有关。手上只有VC6,没MSDN,因此不知道VC和Windows的具体缓存模式是怎么样。假定example.c内容为abc,用VC调试的时候发现,每次写入fputc(ch - 32, fp)都写入了两个字符Bb,B覆盖当前字符,b覆盖下一字符,而ch读取到的总是'b'。当执行到文件尾时,每次EOF结束符都被b覆盖,导致死循环。
每次读取前如果fflush(fp)清除缓存,则一切正常(在Linux下也正常)。