社区
C语言
帖子详情
求教,关于文件尾的判断
dr2tr
2005-03-21 10:52:01
做词法分析
假设我有个文件a.txt,里面内容是a+b
设stream=fopen("a.txt","r")
用while(!feof(stream)){ } 循环读入,我在调试时发现,读入b以后,这个循环还能能继续,似乎文件后面还有内容。
求解
...全文
221
9
打赏
收藏
求教,关于文件尾的判断
做词法分析 假设我有个文件a.txt,里面内容是a+b 设stream=fopen("a.txt","r") 用while(!feof(stream)){ } 循环读入,我在调试时发现,读入b以后,这个循环还能能继续,似乎文件后面还有内容。 求解
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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);
}
数据处理救星降世Power Query
0/ Excel数据处理新利器来了,准备好了吗? 1/ 比网红函数VLOOKUP还全面的功能。——查(查询) 2/ 取其精华,去其糟粕。...——聚(聚合) 9/ 我自己的难题自己造函数,不
求教
别人。——技法(自定义函数)
C语言
文件
操作
所以我们来简单学习一下C对
文件
的操作从
文件
功能角度可以分为以下几类以上就是今天要讲的内容,本文仅仅简单介绍了
文件
的使用,如果有错误希望大家可以给作者留言提意见,作者一定虚心
求教
哦。......
【转】追加内容到
文件
末
尾
的几种常用方法
// 将写
文件
指针移到
文件
尾
。 randomFile . seek ( fileLength ) ; randomFile . writeBytes ( content ) ; randomFile . close ( ) ; } catch ( IOException e ) { e...
C++中对文本
文件
的读写(iostream方法)
原文:http://www.cnitblog.com/wufajiaru/archive/2009/04/15/56390.aspx要写一些简单的日志到文本
文件
中,参考了以下两篇文章:ifstream 和 ofstream( 引用)C++标准库 之 iostream库的学习笔记(二)fstream库以及...
Linux内核设计与实现(14)--虚拟
文件
系统
虚拟
文件
系统,简称VFS。系统中所有
文件
系统不但依赖VFS共存,而且也依靠VFS系统协同工作。程序可以利用标准的Unix系统调用对不同的
文件
系统,甚至不同介质上的
文件
系统进行读写操作。 1.通用
文件
系统接口 ...
C语言
69,396
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章