什么是系统IO:对文件的操作,基本上是输入输出因此一般称为IO接口。在操作系统的层面上,这一组专门针 对文件的IO接口就被称为系统IO 。
系统IO的特点:
由操作系统直接提供的函数接口,特点是简洁,功能单一。
没有提供缓冲区,因此对海量数据的操作效率较低。
套接字Socket、设备文件的访问只能使用系统IO。
API是什么:应用程序接口(函数)。
系统IO主要有这几个函数(open,close,read,write,lseek)。
open函数原型:
int open(const char *pathname,int flags);
int open(const char *pathname,int flags,mode_t mode);
pathname:表示要打开的文件
flags:表示以下几点
O_RDONLY:只读打开文件。
O_WRONLY:只写打开文件。
O_RDWR:读写打开文件。
O_CREAT:如果文件不存在,则创建该文件。
O_TRUNC:文件已存在,则删除文件原有数据。//暂时就说这些
mode:如果文件被创建,则指定权限。
返回值:成功0,失败-1。
close原型:
int close(int fd);
返回值:成功0,失败-1。
代码实现需包含指定头文件:#include <fcntl.h> #include <unistd.h>
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> //open
#include <unistd.h> //close
int main()
{
//第一种打开方式
int fd = open("./file.txt",O_RDWR); //读写打开文件。
if(-1 == fd)
{
printf("打开文件失败\n");
return -1;
}
printf("fd = %d\n",fd); //fd = 3 思考一下,为什么是3
//0标准输入,1标准输出,2标准出错
//第二种打开方式
int newfd = open("./file1.txt",O_RDWR | O_CREAT,0744); //读写打开文件,不存在就创建
if(-1 == newfd)
{
printf("打开文件失败\n");
return -1;
}
close(fd);
close(newfd);
}
read原型:
ssize_t read(int fd,void *buf,size_t count);
fd:从文件读数据。
buf:指向存放读到数据的缓冲区。
count:想要读到的字节数
返回值:成功返回读到的字节数,失败-1。
write原型:
ssize_t write(int fd,void *buf,size_t count);
fd:数据写入文件fd。
buf:指向要写入的数据。
count:要写入的字节数
返回值:成功返回实际写入的字节数,失败-1。
读操作示例代码:
#include <stdio.h>
#include <unistd.h> //read
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> //open
int main()
{
//假设已经打开了文件
//执行读操作,循环读
while(1)
{
ret = read(fd,read_buffer,6);
if(0 == ret)
{
close(fd);
return -1;
}
printf("%s\n",read_buffer); //输出每次读取的内容
memset(read_buffer,0,sizeof(read_buffer));
}
close(fd);
return 0;
}
写操作示例代码
#include <stdio.h>
#include <unistd.h> //read
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> //open
int main()
{
int ret;
char write_buffer[32] = {0};
//假设已经打开文件
//执行写操作,循环写
while(1)
{
printf("请输入要写入数据:");
scanf("%s",write_buffer);
ret = write(newfd,write_buffer,strlen(write_buffer));
if(-1 == ret)
{
close(fd);
return -1;
}
printf("ret = %d\n",ret);
//在每次输入新的内容之前,将数组的内容清空
memset(write_buffer,0,sizeof(write_buffer));
}
close(fd);
return 0;
}
lseek原型:
off_t lseek(int fd,off_t offset,int whence);
fd:要操作的文件描述符
offset:偏移量,可正可负
whence:校准点
SEEK_SET:文件开头
SEEK_CUR:当前位置
SEEK_END:文件末尾
返回值:新文件位置偏移量,失败-1。
关键点:
lseek函数可以将文件位置调整到任意的位置,可以是已有数据的地方,也可以是未有数据的地 方,假设调整到文件末尾之后的某个地方,那么文件将会形成所谓“空洞”。
lseek函数只能对普通文件调整文件位置,不能对管道文件调整。
lseek函数的返回值是调整后的文件位置距离文件开头的偏移量,单位是字节。