首页 > 用户发贴区 > 编程问题提问区 > 对fseek函数的讨论
2006
11-16

先看湖南自学考试“计算机及应用”专业《高级语言程序设计》教材中的一段程序,
这是一个把小写字母转换成大写字母的程序,这里仅把打开文件的盘符和目录做了修改,
其中myturboc是D盘中已经建立的目录,char2.txt是已经建立的文件。


#include<stdio.h>
#include<ctype.h>
main()
{
 FILE *fp;
 char c;
 if((fp=fopen(“d:\\myturboc\\char2.txt”,”r+”))==NULL)
    {
 printf(“file can not open!\n”);
 exit(0);
 }
 while(!feof(fp))
       {
    c=fgetc(fp);
if(islower(c)!=0)
{c=toupper(c);
 fseek(fp,-1L,1);
 fputc(c,fp);
 fseek(fp,0L,1);
 }
}
 fclose(fp);
}
问题:执行fputc(c,fp)语句后文件内部指针后移一个字节的位置,
fseek(fp,0L,1)语句看似没起什么作用但如果去掉fseek(fp,0L,1)程序就无法正常运行。
有哪位朋友知道这是什么原因,我在这里先谢谢了。


有网友kookworm对这个问题的回答是“这个是C语言的一个不太方便的地方,也可以说是一个小Bug,
它要求在两次对文件进行存取操作时必须对函数指针进行重新定位,
johnsany所说的那个不起作用的fseek就是起一个重新定位作用的,虽然那个fseek没有实际移动指针,
但没有它就不可能正确执行。”
我认为“这个是C语言的一个不太方便的地方,也可以说是一个小Bug,
它要求在两次对文件进行存取操作时必须对函数指针进行重新定位”这个观点不一定正确。
其中“函数指针”可能是作者kookworm一时疏忽写错了,应为“文件内部指针”我们不去计较
请看下列程序
#include<stdio.h>
main()
{
 FILE *fp;
 int i;
 char c;
 if((fp=fopen(“d:\\myturboc\\char2.txt”,”w”))==NULL)
    {
  printf(“file can not open!\n”);
  exit(0);
    }
 for(i=0;i<10;i++)
     {    c=getchar();
   fputc(c,fp);
     }
 fclose(fp);
}
这个程序的fputc(c,fp)函数执行了十次对文件的写操作,每执行一次写操作,文件
内部指针向后移动一个字节,程序运行正常并没有因为两次对文件进行存取操作而必须对文件内部指针进行重新定位。


留下一个回复