求教,关于文件尾的判断

dr2tr 2005-03-21 10:52:01
做词法分析
假设我有个文件a.txt,里面内容是a+b
设stream=fopen("a.txt","r")
用while(!feof(stream)){ } 循环读入,我在调试时发现,读入b以后,这个循环还能能继续,似乎文件后面还有内容。
求解
...全文
221 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
dr2tr 2005-03-22
  • 打赏
  • 举报
回复
这两个程序段应该是差不多的,而且我想,用if(feof(fp))显然效率会差些吧。
dr2tr 2005-03-21
  • 打赏
  • 举报
回复
程序满长的,在编程过程中,遇到过以下几个问题:
1。回退部分。在这个算法里,回退似乎是必须的。不知道可不可以在结构上改一下,以不需要回退
2。我用过while(feof(stream)),while(ftell(stream)!=EOF),以及上面getsym中判断ch==-1(0xff) 的 方式
3。作为词法分析,我把内马表存成数组格式,用数组索引表示内码(这里没有把源码贴上去),我想 到过用结构体(这里暂时不用c++),但是相法觉得不够成熟。
4。先写这几点,可能程序太长了,大家不太愿意看吧
justioo 2005-03-21
  • 打赏
  • 举报
回复
文件以 EOF 为默认的结束标志
dr2tr 2005-03-21
  • 打赏
  • 举报
回复

int getsym(FILE* stream)
{
int n;
int vol;
char str[20];
char ch;

ch=getch(stream);
if(ch==0xff)
return 0;
if(ch==' ')//空格?
{
ch=getch(stream);
if(ch==0xff)
return 0;
return 8;
}
else
{
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//字母?
{
n=0;
while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9'))
{
if(n<20)
{
str[n]=ch;
n++;
}
str[n]='\0';
if(compare(str))//不是保留字?
{
printf("%s",str);
return 1;
}
else
{
printf(" %d ",index);
return 2;
}

ch=getch(stream);

}

str[n]='\0';
if(compare(str))//不是保留字?
{
printf("%s",str);
return 1;
}
else
{
printf(" %d ",index);
return 2;
}
if(ch==-1)
return 0;
fseek(stream,-1,SEEK_CUR);//回退
}
else
{
if(ch>='0'&&ch<='9')//数字?
{
vol=0;
while(ch>'0'&&ch<'9')
{
vol=vol*10+ch-'0';
ch=getch(stream);
if(ch==0xff)
return 0;
}
fseek(stream,-1,SEEK_CUR);//回退
printf("%d",vol);
return 3;
}
//双字符处理
else
{
if(ch&0x80)//是双字符?
{
n=0;
while(ch&0x80)
{
if(n<20)
{
str[n]=ch;
n++;
}
ch=getch(stream);
if(ch==0xff)
return 0;
}
str[n]='\0';
if(wcompare(str))//是保留字双字符?
{
printf("%s",str);
return 4;
}
else
{
printf(" %d ",index);
return 5;
}

}
else//运算符判断
{
if(ccompare(ch))
{
if(ch=='#')
{
index=35;
printf(" %d ",index);
return 6;
}
else
{
if(ch!='\n')//待优化
{
printf("operator identfy error\n");
return 0;
}
return 9;

}
}
else
{
printf(" %d ",index);
return 7;
}
}
}
}
}
}

int main(int argc, char* argv[])
{
FILE* stream=fopen("source.txt","r");
while(getsym(stream))
;
fclose(stream);
return 0;
}
jackyqjy 2005-03-21
  • 打赏
  • 举报
回复
楼上的正解,但这究竟是怎么回事?请赐教!
nipcdll 2005-03-21
  • 打赏
  • 举报
回复
while( fgets(str,1000,fp) != NULL )
比较喜欢用这个判断
晨星 2005-03-21
  • 打赏
  • 举报
回复
feof的特性有些乖乖的,是读到结尾后,再读,再调用,才返回true。
改成这样吧:
while(true)
{
读取;//比如fgetc();
if(feof(stream))
break;
处理数据;
}
zjraycj 2005-03-21
  • 打赏
  • 举报
回复
不可能的,你写全源程贴出来看看
jackyqjy 2005-03-21
  • 打赏
  • 举报
回复
楼主,我写了两个小程序,效果应该是一样的。区别在于Sample2会比Sample1的循环多执行一次!
Sample 1:

#include <stdio.h>

#include <stdlib.h>



main()

{

FILE *fp;

int count=0;

char c;



fp = fopen(".\\a.txt","r") ;

printf("%d\n", count);



while(!feof(fp))

{

c = fgetc(fp);

printf("%c\n", c);

count++;

}

printf("%d\n", count);

}



Sample 2:

#include <stdio.h>

#include <stdlib.h>



main()

{

FILE *fp;

int count=0;

char c;



fp = fopen(".\\a.txt","r") ;

printf("%d\n", count);



while(1)

{

c = fgetc(fp);

printf("%c", c);

if(feof(fp))

break;

count++;

}

printf("%d\n", count);

}


69,396

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧