当前位置:  技术问答>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编译,编译成功,执行结果与我想要的结果一致(全部小写变为大写。
   为什么同样的源程序,用不同的编译器会有如此不同结果?

|
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下也正常)。


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • j2ee架构最经典的例子是什么?petstore算是最经典的例子吗?
  • 请大家推荐几个经典的JAVA网站!!(经典者给分)
  • THING IN JAVA 第二版(中文版) 已经出炉了!!(经典的不能再经典了)
  • 经典board游戏 Domination
  • linux有没有像--《windows程序设计》一样经典的书籍
  • 在Linux下开发有哪些经典的书籍值得看
  • 大家帮推荐本 linux下多线程编程 的经典书吧 多谢
  • 求unix经典书籍
  • 求LINUX经典书籍
  • 谁知道经典的DOS游戏去哪里下载?
  • Wii经典街机iPhone移植版 SpaceBubble
  • java中最经典的书是什么
  • 大家能否推荐几个学习java的经典例子?
  • 请前辈介绍一本jsp+数据库的经典好书!!!
  • 请你推荐一本给初学者的jsp经典好书!!!
  • 请问哪一本LINUX源代码分析的书比较经典?
  • 我想系统的学习LINUX,有一订的计算机基础。可以推荐一本经典教材吗?
  • 请教学习c++有那些经典书籍?
  • 请各位大侠推荐两本Solaris的经典书籍?
  • <自己写操作系统>这本书电子版那位有啊?据说很经典的


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3