LINUX下使用风格特色读去文件最后一行两次
2009-09-21 11:47
246 查看
fgets两次读取文件最后一行?
#include <stdlib.h>;
#include <stdio.h>;
int main()
{
FILE *fp;
char ch[11];
fp = fopen("jjk.txt","r");
while(!feof(fp)) //-----------------问题在这里
{
memset(ch, 0, sizeof(ch));
fgets((char *)ch, sizeof(ch)-1, fp);
printf("%s",ch);
}
fclose(fp);
}
[/code]
jjk.txt内容:
aaa
bbb
输出结果:
aaa
bbb
bbb
问题原因解释:
feof是ANSI标准定义的:在遇到文件结束时返回非0值。
对于象DOS系统,这比较方便。因为文件有明确的结束标志EOF。
对于UNIX,就稍微麻烦一点。因为文件没有结束标志,只有通过当前指针和文件长度来判断文件是否结束。当read时,先调用trap进入核心态,由FILE->;ile->;inode,取得文件的物理地址,然后取得文件的剩余的长度,比较该长度是否为0,如果为0则置文件结束标志;如果不为0,则比较该长度和要读的长度,取其中的小值,并将文件内容读入用户地址。
具体到你所遇到的现象就比较清晰了,读文件最后一行的fgets(也是调用read的)被调用的时候,该文件的剩余长度不为0,所以不置文件结束标志。而再fgets时,文件的剩余长度为0,文件结束标志被置且马上返回。
另外,注意到feof返回的是_IOEOF而不是ANSI定义的EOF。
解决方法:
ile(fgets(ch, sizeof(ch)-1, fp) != NULL)
printf("%s",ch);
#include <stdlib.h>;
#include <stdio.h>;
int main()
{
FILE *fp;
char ch[11];
fp = fopen("jjk.txt","r");
while(!feof(fp)) //-----------------问题在这里
{
memset(ch, 0, sizeof(ch));
fgets((char *)ch, sizeof(ch)-1, fp);
printf("%s",ch);
}
fclose(fp);
}
[/code]
jjk.txt内容:
aaa
bbb
输出结果:
aaa
bbb
bbb
问题原因解释:
feof是ANSI标准定义的:在遇到文件结束时返回非0值。
对于象DOS系统,这比较方便。因为文件有明确的结束标志EOF。
对于UNIX,就稍微麻烦一点。因为文件没有结束标志,只有通过当前指针和文件长度来判断文件是否结束。当read时,先调用trap进入核心态,由FILE->;ile->;inode,取得文件的物理地址,然后取得文件的剩余的长度,比较该长度是否为0,如果为0则置文件结束标志;如果不为0,则比较该长度和要读的长度,取其中的小值,并将文件内容读入用户地址。
具体到你所遇到的现象就比较清晰了,读文件最后一行的fgets(也是调用read的)被调用的时候,该文件的剩余长度不为0,所以不置文件结束标志。而再fgets时,文件的剩余长度为0,文件结束标志被置且马上返回。
另外,注意到feof返回的是_IOEOF而不是ANSI定义的EOF。
解决方法:
ile(fgets(ch, sizeof(ch)-1, fp) != NULL)
printf("%s",ch);
相关文章推荐
- python中读取txt文件,windows下么有毛病,到Linux下总是只有最后一行有效,怎么解决?
- 今天在Mac机器上使用了Flex Builder编辑了一个源代码文件,保存后使用vim命令去打开时发现系统自动在每一行的结尾添加了^M符号,其实^M在Linux/Unix中是非常常见的,也就是我们在Win中见过的/r回车符号。由于编辑软件的编码问题,某些IDE的编辑器在编辑完文件之后会自动加上这个^M符号。看起来对我们的源代码没有任何影响,其实并不然,当我们把源代码文件Check In到svn之类
- linux命令_删除文件最后一行
- JAVA使用FTPClient类获取linux上的文件最后修改日期少了8小时
- Linux中通过命令直接删除文件中最后一行
- 关于Linux下feof()输出文件最后一行时重复的问题
- 为什么fgets()会读取文件最后一行两次?
- c++文件读取最后一行读取两次的问题
- linux积累(一)---查看压缩文件的最后一行
- c++ 读取文件 最后一行读取了两次
- Linux中通过命令直接删除文件中最后一行
- Linux使用find查找最后修改时间超过三天的文件并移动到指定目录(附:find找出文件并清空)
- linux 库文件的生成与使用
- 使用xshell在linux和windows之间互传文件
- linux下 tar解压 gz解压 bz2等各种解压文件使用方法
- 使用 SSHFS 挂载远程的 Linux 文件系统及目录
- Linux使用sudo提权时,出现xx 不在 sudoers 文件中。此事将被报告。visudo 命令简单介绍。
- 使用golang获取linux上文件的访问/创建/修改时间
- 理解 Linux 配置文件-分类和使用
- uucp命令_Linux uucp 命令用法详解:UUCP为Unix系统之间,通过序列线来连线的协议。uucp使用UUCP协议,主要的功能为传送文件。