📅  最后修改于: 2023-12-03 15:40:04.614000             🧑  作者: Mango
在Linux系统中,文件描述符是与文件或其他输入/输出资源相关联的整数标识符。所有打开的文件(包括标准输入输出和网络套接字)都由文件描述符引用。在C++编程中,我们可以使用文件描述符来从文件中读取和写入数据,或进行网络通信等操作。
我们可以使用系统调用 open()
来打开文件。该函数的原型如下:
#include <fcntl.h>
int open(const char* pathname, int flags [, mode_t mode]);
其中,pathname
是要打开的文件名,flags
指定了打开方式和打开文件的读写权限,mode
指定了创建文件时的权限(只有在文件不存在时才会使用)。常用的flags
参数有:
O_RDONLY
:只读方式打开文件。O_WRONLY
:只写方式打开文件。O_RDWR
:读写方式打开文件。O_CREAT
:若文件不存在则创建文件。O_EXCL
:与O_CREAT
联合使用,若文件已经存在则报错。示例代码:
#include <fcntl.h>
#include <iostream>
#include <cstdlib> // exit()
int main() {
int fd = open("test.txt", O_CREAT | O_WRONLY, S_IRWXU); // 若文件不存在则创建文件,并以只写方式打开
if (fd == -1) {
std::cerr << "Failed to open file." << std::endl;
std::exit(EXIT_FAILURE);
}
// do something
close(fd); // 关闭文件
return 0;
}
read()
和write()
是使用文件描述符进行读写操作的系统调用。它们的原型如下:
#include <unistd.h>
ssize_t read(int fd, void* buf, size_t count);
ssize_t write(int fd, const void* buf, size_t count);
其中,fd
是文件描述符;buf
是存放读写数据的缓冲区;count
是要读写的字节数。
示例代码:
#include <fcntl.h>
#include <unistd.h>
#include <iostream>
#include <string>
#include <cstdlib> // exit()
int main() {
int fd = open("test.txt", O_RDWR, 0); // 以读写方式打开文件
if (fd == -1) {
std::cerr << "Failed to open file." << std::endl;
std::exit(EXIT_FAILURE);
}
// 写入数据
std::string str = "Hello, world!";
ssize_t written = write(fd, str.c_str(), str.length());
if (written == -1) {
std::cerr << "Failed to write to file." << std::endl;
std::exit(EXIT_FAILURE);
}
// 将文件指针移回文件开头
lseek(fd, 0, SEEK_SET);
// 读取数据
char buf[256] = {0};
ssize_t nread = read(fd, buf, sizeof(buf));
if (nread == -1) {
std::cerr << "Failed to read from file." << std::endl;
std::exit(EXIT_FAILURE);
} else if (nread == 0) {
std::cerr << "End of file." << std::endl;
} else {
std::cout << "Read " << nread << " bytes: " << buf << std::endl;
}
close(fd);
return 0;
}
在使用文件描述符完成读写操作后,我们需要使用close()
关闭文件描述符。该函数原型如下:
#include <unistd.h>
int close(int fd);
其中,fd
是要关闭的文件描述符。
示例代码:
int fd = open("test.txt", O_RDONLY, 0); // 以只读方式打开文件
// do something
close(fd); // 关闭文件