lseek用法

alexandnpu 2010-03-13 08:38:54
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>

int main()
{
char result[100];
FILE *fp = NULL;
int fd = 0;

fp = fopen("alexTest", "r");
fd = fileno(fp);

lseek(fd, 10, SEEK_SET);
fscanf(fp, "%s\n", result);
printf("%s\n", result);

lseek(fd, 0, SEEK_SET); //这一步执行完之后,文件指针怎么没有转到文件头?文件指针好像没动
fscanf(fp, "%s\n", result);
printf("%s\n", result);

fclose(fp);
return 0;
}
...全文
891 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
alexandnpu 2010-03-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 thefirstz 的回复:]

注意Linux下和Windows文件的换行符不一样
Linux下为'\n',而Windows下位'\r\n'
[/Quote]

小弟实在不知这个跟换行符有什么联系。

我在alexTest文件中放的内容是: we have a lot in common
结果,运行的结果却是:
lot
in

而我期望的结果却是:
lot
we
sweird 2010-03-14
  • 打赏
  • 举报
回复


3楼朋友说的有理,文件描述符和文件指针真容易混淆。我刚也是混了。
发现应该用fseek。
3楼朋友已经给出了~
jixingzhong 2010-03-14
  • 打赏
  • 举报
回复
很显然,楼主你使用fopen操作文件,对应的应该使用 fseek

lseek对应的应该open打开操作文件,例子:

函数名称: lseek
函数原型: long lseek(int handle,long offset,int fromwhere)
函数功能: 移动文件位置指针到指定位置
函数返回:
参数说明: handle-文件句柄,offset-文件位置,fromwhere-从文件何处开始移动,该参数可使用以下宏定义:
SEEK_SET-0从文件开始位置计算offset
SEEK_CUR-1从当前位置计算offset
SEEK_END-2从文件结束位置计算offset,此时offset为负数
所属文件: <io.h>

#include <sys\stat.h>
#include <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
int main()
{
int handle;
char msg[]="This is a test";
char ch;
handle=open("TEST.$$$",O_CREAT | O_RDWR,S_IREAD | S_IWRITE);
write(handle,msg,strlen(msg));
lseek(handle,0L,SEEK_SET);
do{
read(handle,&ch,1);
printf("%c",ch);
}while (!eof(handle));
close(handle);
return 0;
}
jixingzhong 2010-03-14
  • 打赏
  • 举报
回复
函数名: lseek
  功 能: 移动文件读/写指针
  用 法: long lseek(int handle, long offset, int fromwhere);
  所有打开的文件都有一个当前文件偏移量(current file offset),以下简称为 cfo。cfo 通常是一个非负整数,用于表明文件开始处到文件当前位置的字节数。读写操作通常开始于 cfo,并且使 cfo 增大,增量为读写的字节数。文件被打开时,cfo 会被初始化为 0,除非使用了 O_APPEND 。
  使用 lseek 函数可以改变文件的 cfo 。
  lseek 的以下用法返回当前的偏移量:
  off_t currpos;
  currpos = lseek(fd, 0, SEEK_CUR);
  这个技巧也可用于判断我们是否可以改变某个文件的偏移量。如果参数 fd(文件描述符)指定的是 pipe(管道)、FIFO 或者 socket,lseek 返回 -1 并且置 errno 为 ESPIPE。
  对于普通文件(regular file),cfo 是一个非负整数。但对于特殊设备,cfo 有可能是负数。因此,我们不能简单地测试 lseek 的返回值是否小于 0 来判断 lseek 成功与否,而应该测试 lseek 的返回值是否等于 -1 来判断 lseek 成功与否。
  lseek 仅将 cfo 保存于内核中,不会导致任何 I/O 操作。这个 cfo 将被用于之后的读写操作。
  如果 offset 比文件的当前长度更大,下一个写操作就会把文件“撑大(extend)”。这就是所谓的在文件里创造“空洞(hole)”。没有被实际写入文件的所有字节由重复的 0 表示。空洞是否占用硬盘空间是由文件系统(file system)决定的。
Samoon 2010-03-14
  • 打赏
  • 举报
回复
lseek? 是不是fseek么? C里面有lseek?
当使用标准库时,不能再使用lseek,否则行为将是未定义的,通常由于缓存的问题导致错误
huanmie_09 2010-03-14
  • 打赏
  • 举报
回复
对同一个文件进行操作,文件描述符fd和FILE *文件指针最好不要混用。
lseek是针对fd的函数调用,不会影响FILE *格式的文件指针位置。

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>

int main()
{
char result[100];
FILE *fp = NULL;
int fd = 0;
int off = 0;

fp = fopen("t.txt", "r");
fd = fileno(fp);

off = lseek(fd, 10, SEEK_SET);
printf("off=%d\n", off);
fscanf(fp, "%s\n", result);
printf("%s\n", result);

fseek(fp, 0, SEEK_SET); /*文件指针回到文件起始处*/
off = lseek(fd, 0, SEEK_SET);
printf("off=%d\n", off);
fscanf(fp, "%s\n", result);

printf("%s\n", result);

fclose(fp);
return 0;
}
昵称很不好取 2010-03-13
  • 打赏
  • 举报
回复
注意Linux下和Windows文件的换行符不一样
Linux下为'\n',而Windows下位'\r\n'
内容概要:本文详细介绍了Linux文件IO函数的基本概念和使用方法,涵盖了文件描述符、文件的打开与创建(open和creat函数)、文件的读写操作(read和write函数)、文件的关闭与其他操作(close、lseek、truncate和ftruncate函数)。文章首先解释了文件描述符的概念及其分配规则,强调其在文件操作中的重要性。接着,通过具体代码示例,详细解析了open、creat、read、write等函数的参数、返回值及实际应用。此外,还介绍了lseek函数用于调整文件指针位置,以及truncate和ftruncate函数用于调整文件大小的方法。最后,总结了这些函数在实际项目中的广泛应用,并展望了进一步学习的方向。 适合人群:具备一定编程基础,尤其是对Linux系统有一定了解的开发者和技术爱好者。 使用场景及目标:① 开发系统工具、服务器应用或数据处理脚本时,需要高效管理和操作文件;② 深入理解Linux系统底层机制,掌握文件IO函数的具体使用方法;③ 提高代码性能和稳定性,优化文件操作流程。 阅读建议:本文内容较为详尽,建议读者结合实际编程项目,逐步实践文中提到的各种函数和操作。特别是在多进程、多线程环境下的文件操作,注意文件描述符的共享与复制,避免竞态条件等问题。通过不断练习和优化代码,加深对Linux文件IO的理解和应用。

70,037

社区成员

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

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