Linux标准IO定位函数,Linux C标准IO库函数详解 一

1、open/close函数

open函数可以打开或者创建一个文件。

#include

#include

#include

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

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

返回值:成功返回新分配的文件描述符,出错返回-1并设置errno

close函数关闭一个已打开的文件:

#include

int close(int fd);

返回值:成功返回0,出错返回-1并设置errno

使用这个函数注意一下几点:

(1)pathname可以是相对路径,也可以是绝对路径

(2)flags有一系列参数可以选择:

O_RDONLY 只读打开

O_WRONLY 只写打开

O_RDWR 可读可写打开

O_APPEND 表示追加。如果文件已有内容,这次打开文件所写的数据附加到文件的末尾而不覆盖原来的内容。

O_CREAT 若此文件不存在则创建它。使用此选项时需要提供第三个参数mode,表示该文件的访问权限.

O_EXCL 如果同时指定了O_CREAT,并且文件已存在,则出错返回

O_TRUNC 如果文件已存在,并且以只写或可读可写方式打开,则将其长度截断(Truncate) 为0字节

2、read/write函数

read函数从打开的设备或文件中读取数据:

#include

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

返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文

件末尾,则这次read返回0

write函数向打开的设备或文件中写数据:

#include

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

返回值:成功返回写入的字节数,出错返回-1并设置errno

3、recv/send函数

recv函数和read函数功能差不多:使用的时候一般把flags赋值为0

#include

#include

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

send函数和write函数功能差不多:

#include

#include

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

4、lseek/fseek函数

设置读写文件的位置,每个打开的文件都记录着当前读写位置,打开文件时读写位置是0,表示文件开头,通常读写多少个字节就会将读写位置往后移多少个字节。但是有一个例外,如果以O_APPEND方式打开,每次写操作都会在文件末尾追加数据,然后将读写位置移到新的文件末尾。 lseek和标准I/O库的fseek函数类似,可以移动当前读写位置(或者叫偏移量).

#include

#include

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

#include

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

使用注意事项:

whence表示处于文件的位置,有如下三个选项:

SEEK_SET 将读写位置指向文件头后再增加offset个位移量。

SEEK_CUR 以目前的读写位置往后增加offset个位移量。

SEEK_END 将读写位置指向文件尾后再增加offset个位移量。

IO库函数的使用:

#include

#include

#include

#include

#include

#include

#include

#include

#include

int main()

{

char* filename = "./hello.txt";

int nFd = 0, nRet = 0;

int nReadLen = 0;

char szBuff[BUFSIZ] = {0};

/* 以读写的方式打开文件 */

nFd = open(filename,O_RDWR);

if(nFd < 0)

{

perror("open:");

return 1;

}

/* 读取文件的内容 */

nReadLen = read(nFd,szBuff,BUFSIZ);

if(nReadLen > 0)

{

printf("read file data: %s\n",szBuff);

}

else

{

perror("read:");

}

/* 往文件里面写入内容 */

char szWrData[] = {"You are small"};

write(nFd,szWrData,strlen(szWrData));

/* 再次读取文件的内容 */

memset(szBuff,0,BUFSIZ);

/* 由于当前的文件位置指针已经指向了文件的末尾,现在再次读取的时候需要把文件的位置指针设置到文件的开头 */

lseek(nFd,0,SEEK_SET);

nReadLen = read(nFd,szBuff,BUFSIZ);

if(nReadLen > 0)

{

printf("read file data: %s\n",szBuff);

}

else

{

perror("read:");

}

/* 关闭文件 */

close(nFd);

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值