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;
}