Linux系统开发-文件IO常用函数详解

文件操作函数

1 系统IO

open函数

函数功能

open 函数是一个重要的系统调用,用于打开或创建文件。

函数原型

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

参数说明

pathname

  • 类型: const char
  • 作用: 指向欲打开的文件路径字符串。这个参数可以是相对路径或绝对路径。

flags

  • 类型: int

  • 作用: 指定文件打开的方式和行为。以下是一些常用的标志位:

    • O_RDONLY: 以只读方式打开文件。

    • O_WRONLY: 以只写方式打开文件。

    • O_RDWR: 以可读写方式打开文件。

    • O_CREAT: 如果文件不存在,则创建该文件。

    • O_EXCL: 当与O_CREAT一起使用时,如果文件已存在,则打开操作失败。

    • O_NOCTTY: 如果文件是终端设备,则不将其作为进程的控制终端。

      这些标志位可以单独使用,也可以通过逻辑或(|)操作符组合使用。

mode

  • 类型: mode_t
  • 作用: 当flags中设置了O_CREAT标志位时,mode参数指定了新创建文件的初始权限。如果没有设置O_CREAT,则mode参数会被忽略。

返回值

  • 如果打开文件成功,open函数返回一个文件描述符,这是一个非负整数,用于后续的读写操作。
  • 如果打开文件失败,open函数返回-1,并设置errno以指示错误原因。
creat函数

函数功能

creat 函数是一个系统调用,用于创建一个新文件,并打开它以便写入。

函数原型:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int creat(const char *pathname, mode_t mode);

参数说明:

pathname

  • 类型: const char
  • 作用: 指向欲创建的文件路径字符串。如果文件已经存在,creat函数会先删除旧文件,然后再创建新文件

mode

  • 类型: mode_t
  • 作用: 指定了新创建文件的初始权限。这个参数是一个八进制数,表示文件的所有者、所属组以及其他用户的读、写和执行权限。
    • 例如,0644 表示所有者有读写权限,组和其他用户只有读权限。

返回值

  • 如果创建文件成功,creat函数返回一个文件描述符,这是一个非负整数,用于后续的文件操作。

  • 如果创建文件失败,creat函数返回-1,并设置errno以指示错误原因。

write函数

函数功能

往一个打开的文件描述符里面写内容

函数原型

#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);

参数说明

fd

  • 类型: int
  • 作用: 文件描述符,标识了要写入数据的目标文件或设备。这个文件描述符通常是通过open、creat或其他相关函数获得的。

buf

  • 类型: const void
  • 作用: 指向要写入数据的缓冲区的指针。这个缓冲区包含了要写入的数据。

count

  • 类型: size_t
  • 作用: 要写入的数据的字节数。这个参数指定了从buf指向的缓冲区中写入多少字节到文件描述符fd所指向的文件或设备中。

返回值

  • 如果写入成功,write函数返回实际写入的字节数。
  • 如果写入失败,write函数返回-1,并设置errno以指示错误原因。
read函数

函数功能

用于从文件描述符所指向的文件或设备中读取数据

函数原型

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

参数说明

fd

  • 类型: int
  • 作用: 文件描述符,标识了要从中读取数据的源文件或设备。这个文件描述符通常是通过open、creat或其他相关函数获得的。

buf

  • 类型: void
  • 作用: 指向用于存储读取数据的缓冲区的指针。这个缓冲区将接收从文件描述符fd所指向的文件或设备中读取的数据。

count

  • 类型: size_t
  • 作用: 指定了最多要读取的数据的字节数。这个参数指定了buf指向的缓冲区的最大容量。

返回值

  • 如果读取成功,read函数返回实际读取的字节数。
  • 如果读取失败,read函数返回-1,并设置errno以指示错误原因。
  • 如果已达到文件尾,read函数返回0。
close函数

函数功能

用于关闭一个打开的文件描述符

函数原型

#include <unistd.h>

int close(int fd);

参数说明

fd

  • 类型: int
  • 作用: 文件描述符,标识了要关闭的文件或设备。这个文件描述符通常是通过open、creat或其他相关函数获得的。*

返回值

  • 如果关闭成功,close函数返回0。
  • 如果关闭失败,close函数返回-1,并设置errno以指示错误原因。
lseek函数

函数功能

用于重新定位文件描述符所指向的文件或设备的读写位置。

函数原型

#include <sys/types.h>
#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence);

参数说明

fd

  • 类型: int
  • 作用: 文件描述符,标识了要重新定位读写位置的文件或设备。这个文件描述符通常是通过open、creat或其他相关函数获得的。

offset

  • 类型: off_t
  • 作用: 偏移量,指定了从whence参数指定的位置开始的偏移字节数。正数表示向后偏移,负数表示向前偏移。

whence

  • 类型: int
  • 作用: 基准位置,指定了offset参数的基准点。它可以取以下三个值之一:
    SEEK_SET: 从文件头部开始偏移offset个字节。
    SEEK_CUR: 从文件当前读写的指针位置开始,增加offset个字节的偏移量。
    SEEK_END: 从文件末尾开始偏移offset个字节。

返回值

  • 如果定位成功,lseek函数返回新的文件偏移量。
  • 如果定位失败,lseek函数返回-1,并设置errno以指示错误原因。
strstr函数

函数功能

在一个字符串中查找另一个字符串首次出现的位置

函数原型

#include <string.h>

char *strstr(const char *haystack, const char *needle);

参数说明

haystack

  • 类型:char

  • 作用:指向被搜索的主字符串的指针。

needle

  • 类型:char

  • 作用:指向要搜索的子字符串的指针。

返回值

  • 如果找到子字符串,则返回一个指向主字符串中子字符串首次出现位置的指针。
  • 如果没有找到子字符串,则返回 NULL。

2 标准IO

fopen函数

函数功能

用于打开一个文件,并返回一个指向FILE类型的指针,该指针可用于后续的文件操作。

函数原型

#include <stdio.h>

FILE *fopen(const char *pathname, const char *mode);

参数说明

  • filename: 指向一个字符串的指针,该字符串包含了要打开的文件的路径和名称。
  • mode: 指向一个字符串的指针,该字符串指定了文件的打开模式。

返回值

  • 如果文件成功打开,fopen() 返回一个指向FILE类型的指针。
  • 如果文件打开失败,fopen() 返回 NULL,并设置全局变量 errno 以指示错误原因。

文件打开模式

  • r: 打开一个文本文件以进行读取。文件必须存在。
  • r+: 打开一个文本文件以进行更新(读取和写入)。文件必须存在。
  • w: 打开一个文本文件以进行写入。如果文件存在,则截断文件;如果文件不存在,则创建文件。
  • w+: 打开一个文本文件以进行更新(读取和写入)。如果文件存在,则截断文件;如果文件不存在,则创建文件。
  • a: 打开一个文本文件以进行追加。写入的数据将被添加到文件末尾。如果文件不存在,则创建文件。
  • a+: 打开一个文本文件以进行更新(读取和追加)。写入的数据将被添加到文件末尾。如果文件不存在,则创建文件。
fread函数

函数功能

用于从文件中读取数据并将其存储到内存中的缓冲区。

函数原型

#include <stdio.h>

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

参数说明

  • ptr: 指向一个缓冲区的指针,数据将被读取到这个缓冲区中。
  • size: 每个数据项的字节大小。
  • nmemb: 要读取的数据项的数量。
  • stream: 指向一个FILE对象的指针,该对象标识了要从中读取数据的文件流。

返回值

  • 成功返回成功读取到的数据项个数
  • 失败返回0
fwrite 函数

函数功能

用于将数据从内存中的缓冲区写入到文件中

函数原型

 #include <stdio.h>
 
 size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);

参数说明

  • ptr: 指向一个缓冲区的指针,数据将从这个缓冲区中写入文件。
  • size: 每个数据项的字节大小。
  • nmemb: 要写入的数据项的数量。
  • stream: 指向一个FILE对象的指针,该对象标识了要写入数据的文件流。

返回值

  • 如果成功返回实际写入的数据项的数量。
  • 如果返回值小于请求的数量,可能是由于发生写入错误或其他原因。
fclose 函数

函数功能

用于关闭一个已经打开的文件流,并释放与之关联的所有资源。

函数原型

#include <stdio.h>

int fclose(FILE *stream);

参数说明

  • stream: 指向一个FILE对象的指针,该对象标识了要关闭的文件流。

返回值

  • 如果文件成功关闭,fclose() 返回 0。
  • 如果关闭过程中发生错误,fclose() 返回 EOF(通常定义为 -1),并且设置全局变量 errno 以指示错误原因。
fseek 函数

函数功能

用于在文件流中移动读写位置指针到指定的位置。

函数原型

#include <stdio.h>

int fseek(FILE *stream, long offset, int whence);

参数说明

  • stream: 指向一个FILE对象的指针,该对象标识了要进行位置移动的文件流。
  • offset: 表示要移动的字节数。如果是正数,指针将向前移动;如果是负数,指针将向后移动。
  • whence: 基准位置,其值可以是:
    • SEEK_SET: offset 被视为从文件开始处的绝对位置。
    • SEEK_CUR: offset 被视为从当前位置的相对偏移量。
    • SEEK_END: offset 被视为从文件末尾的相对偏移量。

返回值

  • 如果位置成功改变,fseek() 返回 0。
  • 如果发生错误,fseek() 返回 EOF(通常定义为 -1),并且设置全局变量 errno 以指示错误原因。
fgetc函数

函数功能

用于从指定的文件流中读取下一个字符。

函数原型

#include <stdio.h>

int fgetc(FILE *stream);

参数说明

  • stream: 指向一个FILE对象的指针,该对象标识了要从中读取字符的文件流。

返回值

  • 如果成功读取字符,fgetc() 返回读取的字符作为无符号字符值。
  • 如果到达文件末尾或发生读取错误,fgetc() 返回 EOF(通常定义为 -1)
fgets函数

函数功能

用于从文件流中读取一行字符串

函数原型

#include <stdio.h>
char *fgets(char *s, int size, FILE *stream);

参数说明

  • s: 指向一个字符数组的指针,该数组存储了要读取的字符串。
  • size: 要读取的最大字符数(包括最后的空字符)。
  • stream: 指向一个FILE对象的指针,该对象标识了要从中读取数据的文件流。

返回值

  • 如果成功读取字符串,fgets() 返回指向字符数组的指针。
  • 如果到达文件末尾或发生错误,fgets() 返回 NULL。
fputc函数

函数功能

用于将一个字符写入到指定的文件流中

函数原型

#include <stdio.h>
int fputc(int c, FILE *stream);

参数说明

  • c: 要写入的字符。虽然参数类型是 int,但实际上只能传递一个字符值(即 char 类型的值)。
  • stream: 指向一个FILE对象的指针,该对象标识了要写入数据的文件流。

返回值

  • 如果字符成功写入,fputc() 返回写入的字符。
  • 如果发生错误,fputc() 返回 EOF(通常定义为 -1),并且设置全局变量 errno 以指示错误原因。
fputs函数

函数功能

用于将一个字符串写入到指定的文件流中

函数原型

#include <stdio.h>
int fputs(const char *s, FILE *stream);

参数说明

  • s: 指向一个字符串的指针,该字符串包含要写入的字符序列,以空字符(\0)结尾。
  • stream: 指向一个FILE对象的指针,该对象标识了要写入数据的文件流。

返回值

  • 如果字符串成功写入,fputs() 返回 0。
  • 如果发生错误,fputs() 返回 EOF(通常定义为 -1),并且设置全局变量 errno 以指示错误原因。
putchar函数

函数功能

用于将一个字符写入到标准输出(通常是屏幕)

函数原型

#include <stdio.h>
int putchar(int c);

参数说明

  • char: 要写入的字符。虽然参数类型是 int,但实际上只能传递一个字符值(即 char 类型的值)。

返回值

  • 如果字符成功写入,putchar() 返回写入的字符。
  • 如果发生错误,putchar() 返回 EOF(通常定义为 -1),并且设置全局变量 errno 以指示错误原因。
feof函数

函数功能

用于检测文件流是否已经到达文件末尾。

函数原型

#include <stdio.h>
int feof(FILE *stream);

参数说明

  • stream: 指向一个FILE对象的指针,该对象标识了要检测的文件流。

返回值

  • 如果文件流的文件结束标志被设置(即已经到达文件末尾),feof() 返回非零值。
  • 如果文件流的文件结束标志未被设置(即尚未到达文件末尾),feof() 返回 0。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT光哥吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值