0%

Linux文件IO

文件描述符

文件描述符就是Linux系统分配给文件或套接字的整数。

对于标准输入输出和错误,Linux也有分配:

文件描述符 对象
0 标准输入:standard input
1 标准输出:standard output
2 标准错误:standard error

Linux中网络套接字其实就是文件,所以对文件的操作可以完全套用在网络套接字上。

文件操作

打开文件

1
2
3
4
5
#include <sys/types.h>
#include <sts/stat.h>
#include <fcntl.h>
// 成功返回文件描述符,失败返回-1
int open(const char *path,int flag);

第一个参数为路径,第二个参数为文件打开模式。

打开模式 含义
O_CRETA 必要时创建文件
O_TRUNC 删除全部现有数据
O_APPEND 维持文本现有数据,保存到当前数据最后
O_RDONLY 只读方式打开
O_WRONLY 只写方式打开
O_RDWR 读写方式打开

关闭文件

1
2
3
#include <unistd.h>
// 成功返回0,失败返回-1
int close(int fd);

调用close()关闭文件或套接字。

向文件写入数据

1
2
3
#include <unistd.h>
// 成功返回写入的字节数,失败返回-1
ssize_t write(int fd,const void *buf,size_t nbytes);

向文件或套接字中写入数据。

读取文件数据

1
2
3
#include <unistd.h>
// 成功返回接收的字节数(遇到文件结尾返回0),失败返回-1
ssize_t read(int fd,void *buf,size_t nbytes);

从文件或套接字中读数据。

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <iostream>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>

void error_handle(std::string opt,std::string message){
perror(opt.c_str());
std::cout << message << std::endl;
exit(1);
}

int main(int argc,char* argv[]){
char Hbuf[]="Hello,";
char Wbuf[]=", Welcome!";
char message[128]={0};
char recv_buf[64]={0};
int fd;
ssize_t write_size,read_size;
if(argc<2){
std::cout << "Usage : " << argv[0] << " [filename] " << std::endl;
exit(1);
}
fd=open(argv[1],O_CREAT|O_TRUNC|O_RDWR);
if(fd<0){
error_handle("open","open() error.");
}
// 写入Hello
write_size=write(fd,Hbuf,strlen(Hbuf));
if(write_size<0){
error_handle("write","write() Hbuf error.");
}
std::cout << " 请输入用户名: " << std::endl;
std::cin>>recv_buf;
// 写入用户名和Welcome
write_size=write(fd,recv_buf,strlen(recv_buf));
if(write_size<0){
error_handle("write","write() recv_buf error.");
}
write_size=write(fd,Wbuf,strlen(Wbuf));
if(write_size<0){
error_handle("write","write() Wbuf error.");
}

// 关闭文件
close(fd);
// 再次打开文件,使用只读模式
fd=open(argv[1],O_RDONLY);
if(fd<0){
error_handle("open","open() error.");
}
// 读取文件数据
read_size=read(fd,message,sizeof message);
if(read_size<0){
error_handle("read","read() message error.");
}
// 将读取的数据打印输出
std::cout << " 从文件中读取到 " << read_size << " 个字节的数据." << std::endl;
std::cout << message << std::endl;
// 最后关闭文件
close(fd);
return 0;
}