熟悉C语言的请进

来源:百度知道 编辑:UC知道 时间:2024/06/24 04:17:35
这个C语言程序实现的是将一个文本文件的内容倒序显示在屏幕上,为什么老是出现死循环的问题~~请高手指点一二~~
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define MAXLEN 100
void main(void)
{
char filename[MAXLEN];
int ch;
FILE *fp;
printf("\ninput a file name:");
scanf("%s",filename);
fp=fopen(filename,"r");
if(!fp)
{
printf("open file %s error!",filename);exit(0);
}
fseek(fp,0,2);//三个参数的含义:文件指针,偏移量,位置(0,文件头;1,当前位置;2,文件末尾
fseek(fp,-1,1);//从当前位置往后移一个字节位置,使得位置指针指向倒数第一个字符
while(ftell(fp)>=0)//问题可能在这个地方,不过好像又没错~~
{
ch=fgetc(fp);
putchar(ch);
fseek(fp,-2,1);
}
fclose(fp);
getche();
}

这个问题有两个地方需要解释:
1、如果文件以文本方式打开,则使用ftell()将不能获得准确的文件指针位置。
2、如果使用fseek()移动文件指针,那么需要留意,当文件指针被移动到文件起始位置以前的位置时,系统将设定错误标志errno值为EINVAL(此变量定义在errno.h中),并且ftell()返回错误的文件指针位置。

建议:
1、打开文件时,使用
fp=fopen(filename,"rb");
2、判断ftell()==0时,仅做一次输出,并跳出循环:
if (ftell() == 0)
{
ch = fgetc(fp);
putchar(ch);
break;
}
else
{
ch = fgetc(fp);
putchar(ch);
fseek(fp,-2,1);
}

循环当中的ch=fgetc(fp);语句每次也会将文件位置指针向前移动,根据不同字符的实际格式,可能移动两个位置也可能移动一个位置,如果恰好读入的是移动两个位置的字符时,会与你后面调用的fseek(fp,-2,1); 语句产生的步长相同,导致文件位置指针始终固定在原地。