一、文件定位
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的特性:
-
没有缓存区
-
操作对象是文件描述符:
- 文件描述符是一个小的非负整数,用于标识已打开的文件。
- 文件描述符通常在程序中以整数表示(如 0、1、2)。
-
文件描述符:
- 每当内核打开一个文件时,会分配一个文件描述符给该文件。
- 文件描述符是非负整数,通常范围在 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。