Linux系统编程(3)文件定位、缓冲区和文件IO

一、文件定位

1.feof

feof 函数用于检查文件读取过程中是否达到了文件末尾(EOF)。

#include <stdio.h>

int feof(FILE *stream);

stream: 指向一个 FILE 结构体的指针,表示要检查的文件流。 

  • 如果文件流的文件结束标志被设置(即已到达文件末尾),则返回非零值。
  • 否则,返回 0。

2.ferror

ferror 函数用于检查文件流在操作过程中是否发生了错误。

#include <stdio.h>

int ferror(FILE *stream);

stream: 指向一个 FILE 结构体的指针,表示要检查的文件流。

  • 如果文件流的错误标志被设置,则返回非零值。
  • 否则,返回 0。

3.fseek

fseek 函数用于移动文件指针到文件中的指定位置。

#include <stdio.h>

int fseek(FILE *stream, long offset, int whence);
  • stream: 指向一个 FILE 结构体的指针,表示要操作的文件流。
  • offset: 相对于 whence 的偏移量,以字节为单位。
  •                         正:向后偏移
                            负:向前偏移
                            零:不偏移
  • whence: 指定从哪里开始计算偏移量,可以是以下值之一:
    • SEEK_SET: 从文件的开头开始计算。
    • SEEK_CUR: 从文件指针的当前位置开始计算。
    • SEEK_END: 从文件的末尾开始计算。
  • 成功时返回 0。
  • 失败时返回非零值。

4.ftell

ftell 函数用于获取文件指针的当前位置。

#include <stdio.h>

long ftell(FILE *stream);

stream: 指向一个 FILE 结构体的指针,表示要操作的文件流。

  • 返回文件指针当前位置的长整型值(以字节为单位)。
  • 失败时返回 -1L

ftell将指针移动至文件末尾时,可以获取到整个文件的字节大小。

5.rewind

rewind 函数用于将文件指针重置到文件的开头。

#include <stdio.h>

void rewind(FILE *stream);

stream: 指向一个 FILE 结构体的指针,表示要操作的文件流。

二、缓冲区

缓冲是指在输入输出操作(I/O操作)中使用一块内存区域(缓冲区)来暂时存储数据。

缓冲区的目的是为了解决高速设备和低速设备之间的数据交换。

缓冲操作:在读取或写入数据时,先将数据存储到缓冲区,然后再进行实际的I/O操作。

1.行缓冲  1024byte(Linux下)

行缓冲适用于交互式输入输出,确保用户能够及时看到输出
                1.遇到\n刷新
                2.缓存区满刷新
                3.程序结束刷新
                4.fflush函数立即刷新  

#include <stdio.h>

int fflush(FILE *stream);

2.全缓冲     4K
全缓冲适用于文件等非交互式I/O操作,提升性能。

刷新条件:
                1.缓存区满刷新
                2.程序结束刷新
                3.fflush来刷新  fflush(fp);

3.无缓冲 

无缓冲适用于需要实时输出的情况, 主要用于出错处理信息的输出 stderr ,不对数据缓存直接刷新。

三、文件IO

        在 Linux 操作系统中,文件 I/O(输入/输出)是通过一组系统调用实现的,这些调用提供了对文件和设备进行读写操作的功能。文件 I/O 主要用于与设备文件和普通文件进行交互。Linux 内核的文件 I/O 机制可以绕过缓存区,直接操作文件描述符

文件IO的特性:

  1. 没有缓存区

  2. 操作对象是文件描述符:

    • 文件描述符是一个小的非负整数,用于标识已打开的文件。
    • 文件描述符通常在程序中以整数表示(如 0、1、2)。
  3. 文件描述符:

    • 每当内核打开一个文件时,会分配一个文件描述符给该文件。
    • 文件描述符是非负整数,通常范围在 0 到 1023 之间。

每个程序在启动时,操作系统会为其打开三个默认文件描述符:

  • 0:标准输入对应 stdin
  • 1:标准输出对应 stdout
  • 2:标准错误输出对应 stderr

1.open

open 函数用于打开一个文件,并返回一个文件描述符。

#include <fcntl.h>
#include <unistd.h>

int open(const char *pathname, int flags, ...);
  • pathname:要打开的文件路径。
  • flags:文件打开的标志,决定文件的打开方式,可以是以下值的组合:
    • O_RDONLY:以只读方式打开。
    • O_WRONLY:以只写方式打开。
    • O_RDWR:以读写方式打开。
    • O_CREAT:如果文件不存在则创建它。
    • O_TRUNC:如果文件已存在并以写入方式打开,则将其长度截断为 0。
    • O_APPEND:以追加模式打开。
  • 可选的第三个参数:在创建文件时指定文件权限(当使用 O_CREAT 标志时)。 0666
  • 成功时返回文件描述符(非负整数)。
  • 失败时返回 -1

2.write

write 函数用于向文件描述符指向的文件中写入数据。

#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);
  • fd:文件描述符。
  • buf:要写入的数据缓冲区。
  • count:要写入的字节数。
  • 成功时返回实际写入的字节数。
  • 失败时返回 -1

3.read

read 函数用于从文件描述符指向的文件中读取数据。

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);
  • fd:文件描述符。
  • buf:存储读取数据的缓冲区。
  • count:要读取的字节数。
  • 成功时返回实际读取的字节数(可能小于 count)。
  • 如果已到达文件末尾,返回 0。
  • 失败时返回 -1

4.close

close 函数用于关闭文件描述符。

#include <unistd.h>

int close(int fd);

 fd:文件描述符。

  • 成功时返回 0。
  • 失败时返回 -1

5.lseek

lseek 函数是一个用于操作文件描述符的系统调用,它可以改变文件指针的位置。

#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence);
  • fd:文件描述符,表示要操作的文件。
  • offset:相对于 whence 的偏移量。可以是正数、零或负数。
  • whence:决定如何使用 offset,其值可以是以下三个之一:
    • SEEK_SET:文件指针被设置为距离文件开头 offset 字节的位置。
    • SEEK_CUR:文件指针被设置为距离当前指针位置 offset 字节的位置。
    • SEEK_END:文件指针被设置为距离文件结尾 offset 字节的位置。
  • 成功时返回新的文件指针位置(相对于文件开头的字节数)。
  • 失败时返回 -1。
  • 29
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值