`

lseek

阅读更多

1. 每个打开的文件都有一个与其相关的“文件位置”。

2. 文件位置通常是一个非负整数,
unix_c_03.txt
用以度量从文件头开始计算的字节数。

3. 读写操作都从当前文件位置开始,
并根据所读写的字节数,增加文件位置。

4. 打开一个文件时,除非指定了O_APPEND,
否则文件位置一律被设为0。

5. lseek函数仅将文件位置记录在内核中,
并不引发任何I/O动作。

6. 在超越文件尾的文件位置写入数据,
将在文件中形成空洞。

7. 文件空洞不占用磁盘空间,但被算在文件大小内。
#include <sys/types.h>
#include <unistd.h>
off_t lseek (
int fd, // 文件描述符
off_t offset, // 偏移量
int whence // 起始位置
);
成功返回当前文件位置,失败返回-1。
whence取值:
SEEK_SET - 从文件头
(文件的第一个字节)。
SEEK_CUR - 从当前位置
(上一次读写的最后一个字节的下一个位置)。
SEEK_END - 从文件尾
(文件的最后一个字节的下一个位置)。
范例:seek.c
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>

int main (void) {
	int fd = open ("seek.txt", O_RDWR | O_CREAT | O_TRUNC, 0644);
	if (fd == -1) {
		perror ("open");
		return -1;
	}

	const char* text = "Hello, World !";
	if (write (fd, text, strlen (text) * sizeof (text[0])) == -1) {
		perror ("write");
		return -1;
	}

	if (lseek (fd, -7, SEEK_CUR) == -1) {
		perror ("lseek");
		return -1;
	}

	off_t pos = lseek (fd, 0, SEEK_CUR);
	if (pos == -1) {
		perror ("lseek");
		return -1;
	}

	printf ("当前文件位置:%ld\n", pos);

	text = "Linux";
	if (write (fd, text, strlen (text) * sizeof (text[0])) == -1) {
		perror ("write");
		return -1;
	}

	if (lseek (fd, 8, SEEK_END) == -1) {
		perror ("lseek");
		return -1;
	}

	text = "<-这里有个洞洞!";
	if (write (fd, text, strlen (text) * sizeof (text[0])) == -1) {
		perror ("write");
		return -1;
	}

	off_t size = lseek (fd, 0, SEEK_END);
	if (size == -1) {
		perror ("lseek");
		return -1;
	}

	printf ("文件大小:%ld字节\n", size);

	close (fd);

	return 0;
}
思考:既然lseek系统调用相当于标C库函数fseek,
那么是否存在与标C库函数ftell相对应的系统调用?
不存在,
因为通过lseek(fd,0,SEEK_CUR)就可以获得当前文件位置。


如何获取文件的大小?
通过lseek(fd,0,SEEK_END)可以获得文件的大小。


分享到:
评论

相关推荐

    Linux应用编程之lseek详解

    Linux应用编程之lseek详解 1、lseek函数介绍 (1)、文件指针:当我们要对一个文件进行读写时,一定要先打开这个文件,所以我们读写的所有文件都是动态文件。动态文件在内存中的形态就是文件流的形式。 (2...

    linux设备驱动归纳总结(三):3.设备驱动面向对象思想和lseek的实现

    本篇主要聚焦于设备驱动开发中的面向对象思想和`lseek`函数的实现,这两部分是设备驱动编程中的关键概念。 面向对象思想在Linux设备驱动中的应用: 面向对象编程(Object-Oriented Programming, OOP)是一种程序...

    Linux lseek函数的使用详解

    Linux lseek函数是Unix-like操作系统下用于文件操作的重要函数,它允许程序重新定位文件读写指针,从而在文件中的不同位置进行读写操作。在Linux编程中,特别是在处理大文件或实现某些高级I/O功能时,lseek的使用...

    C语言中lseek()函数和fseek()函数的使用详解

    在C语言中,文件操作是程序处理数据流的重要部分,`lseek()`和`fseek()`函数则是控制文件读写位置的关键工具。这两个函数都允许程序员改变文件内部的读写指针,以便在文件的不同位置进行读写操作,但它们在使用上有...

    O_APPEND与读操作

    在Linux系统中,文件操作是通过系统调用来完成的,比如`open`、`write`、`read`和`lseek`等。本主题聚焦于`O_APPEND`标志和`lseek`函数在文件访问中的行为,特别是它们如何影响读写操作。 `O_APPEND`是一个在`open`...

    FatFS文件系统函数说明

    5. **f_lseek**:改变文件读写位置,支持绝对和相对偏移量的移动。 6. **f_truncate**:截断文件至指定长度,如果长度大于当前文件大小则无效果。 7. **f_sync**:同步文件缓冲区到磁盘,确保数据安全写入。 8. *...

    Debugging with GDB --2003年6.0

    Table of Contents Summary of gdb . . . . . . . . ....Free software ....Free Software Needs Free Documentation ....Contributors to gdb....1 A Sample gdb Session ....2 Getting In and Out of gdb ....2.1 Invoking gdb ....

    Linux系统编程笔记

    off_t lseek(int fd, off_t offset, int whence); ``` - **作用**:更改文件描述符`fd`的当前位置。`offset`表示偏移量,`whence`可为`SEEK_SET`、`SEEK_CUR`或`SEEK_END`。 ##### 7. `fsync()` - **原型**: ``...

    嵌入式Linux文件操作.zip

    本压缩包提供了关于文件操作的C语言源码示例,包括`file_lseek.c`和`file_wr.c`两个文件,分别涉及文件指针定位(lseek)和文件写入(write)功能。以下将详细介绍这两个知识点。 1. **文件指针定位(lseek)** 在...

    Linux 2.6.17.9内核文件系统调用详解

    本资源主要讲述 Linux 2.6.17.9 内核版本中文件 I/O 操作的实现,包括主要的数据结构、宏定义和函数流程,并分别讲述 open、create、close、read、write、lseek 系统调用。 1. 数据结构 在 Linux 2.6.17.9 内核中...

    操作系统实验1-系统调用实验.pdf

    在本实验中,我们使用了多种系统调用,包括 read、write、open、create、lseek 和 close。 * read 系统调用用于从文件中读取数据。 * write 系统调用用于将数据写入文件中。 * open 系统调用用于打开文件,以便进行...

    windows下使用tail命令-tail2win

    在Windows操作系统中,通常我们习惯于使用图形化界面来管理和查看文件,但对于习惯于Linux环境的用户来说,一些命令行工具如`tail`是必不可少的。`tail`命令在Linux中用于查看文件的尾部内容,它对于实时监控日志...

    实验四-Linux下的C语言编程.doc

    * LINUX/UNIX 文件系统中常用的系统调用:read(), write(), open(), creat(), close(), lseek(), stat(), link(), unlink() * 文件操作:读取文件、写入文件、创建文件、关闭文件、定位文件指针、获取文件信息、链接...

    图书管理系统

    系统的核心是利用Linux的系统调用,如open、write、read和lseek,来操作文件存储的图书信息。 在设计上,系统分为几个主要的函数模块: 1. 录入函数(entry):用于录入新的图书记录。它首先通过open系统调用打开...

    linux文件IO编程可用.pdf

    在这个主题中,我们将深入理解 Linux 系统调用提供的核心功能,如 `open`、`read`、`write`、`lseek` 和 `close`。 1. **open** 函数用于打开文件或者创建新文件。`open` 函数接收三个参数:文件路径、打开模式(如...

    c++面试题网络编程篇

    本文总结了C++面试题网络编程篇中的重要知识点,包括dup和dup2函数、lseek函数、sync、fsync和fdatasync函数、fcntl函数、exit和_exit函数、setjmp和longjmp函数、记录锁、守护进程编程规范等。 1. dup和dup2函数 ...

    linux文件IO之整理笔记

    本文总结了 Linux 文件 IO 的相关知识点,涵盖了文件 IO 的基本概念、文件描述符、open 函数、read 函数、write 函数、lseek 函数、close 函数等。 一、文件 IO 概念 文件 IO 是计算机操作系统中最基本的输入/输出...

Global site tag (gtag.js) - Google Analytics