文件描述符与文件流指针:C++ 中的文件操作之旅

目录

​编辑

一、文件描述符:操作系统的小助手

1.1 什么是文件描述符

1.2 常见的文件描述符

1.3 使用文件描述符进行文件操作

代码解释:

二、文件流指针:C++ 标准库的利器

2.1 什么是文件流指针

2.2 使用文件流指针进行文件操作

代码解释:

三、文件描述符与文件流指针的转换

3.1 文件描述符转换为文件流指针

3.2 文件流指针转换为文件描述符

四、总结

        在 C++ 编程的世界里,文件操作是一项基础且重要的技能。而在文件操作的背后,文件描述符和文件流指针扮演着至关重要的角色。它们是我们与文件系统沟通的桥梁,理解它们的工作原理和使用方法,能让我们更加高效地进行文件操作。今天,就让我们一起深入探索文件描述符与文件流指针的奥秘。

一、文件描述符:操作系统的小助手

1.1 什么是文件描述符

        文件描述符是操作系统为每个打开的文件或设备分配的一个非负整数。在 Linux 等类 Unix 系统中,每个进程都有一个文件描述符表,文件描述符就是这个表的索引。通过文件描述符,进程可以方便地对文件进行读写等操作。

1.2 常见的文件描述符

        每个进程启动时,都会默认打开三个文件描述符:

  • 标准输入(stdin):文件描述符为 0,通常对应键盘输入。
  • 标准输出(stdout):文件描述符为 1,通常对应终端屏幕输出。
  • 标准错误(stderr):文件描述符为 2,用于输出错误信息。

1.3 使用文件描述符进行文件操作

        下面是一个简单的 C++ 代码示例,展示了如何使用文件描述符进行文件的读写操作:

#include <iostream>
#include <fcntl.h>
#include <unistd.h>
#include <cstring>

int main() {
    // 打开文件
    int fd = open("test.txt", O_RDWR | O_CREAT, 0666);
    if (fd == -1) {
        perror("open");
        return 1;
    }

    // 写入数据
    const char* data = "Hello, File Descriptor!";
    ssize_t bytes_written = write(fd, data, strlen(data));
    if (bytes_written == -1) {
        perror("write");
        close(fd);
        return 1;
    }

    // 将文件指针移到文件开头
    lseek(fd, 0, SEEK_SET);

    // 读取数据
    char buffer[100];
    ssize_t bytes_read = read(fd, buffer, sizeof(buffer));
    if (bytes_read == -1) {
        perror("read");
        close(fd);
        return 1;
    }

    buffer[bytes_read] = '\0';
    std::cout << "Read from file: " << buffer << std::endl;

    // 关闭文件
    close(fd);

    return 0;
}

代码解释:

  • open 函数用于打开或创建文件,返回一个文件描述符。
  • write 函数通过文件描述符将数据写入文件。
  • lseek 函数用于移动文件指针的位置。
  • read 函数从文件描述符对应的文件中读取数据。
  • close 函数关闭文件描述符,释放资源。

二、文件流指针:C++ 标准库的利器

2.1 什么是文件流指针

        文件流指针是 C++ 标准库中用于文件操作的抽象概念。它通过 fstream 类及其派生类(如 ifstream 用于输入,ofstream 用于输出,fstream 用于读写)来实现。文件流指针提供了更高级、更面向对象的文件操作方式。

2.2 使用文件流指针进行文件操作

下面是一个使用文件流指针进行文件读写的示例代码:

#include <iostream>
#include <fstream>
#include <string>

int main() {
    // 打开文件进行写入
    std::ofstream outfile("test_stream.txt");
    if (!outfile.is_open()) {
        std::cerr << "Failed to open file for writing." << std::endl;
        return 1;
    }

    // 写入数据
    outfile << "Hello, File Stream Pointer!" << std::endl;
    outfile.close();

    // 打开文件进行读取
    std::ifstream infile("test_stream.txt");
    if (!infile.is_open()) {
        std::cerr << "Failed to open file for reading." << std::endl;
        return 1;
    }

    // 读取数据
    std::string line;
    if (std::getline(infile, line)) {
        std::cout << "Read from file: " << line << std::endl;
    }

    infile.close();

    return 0;
}

代码解释:

  • std::ofstream 用于创建一个输出文件流,打开文件进行写入操作。
  • << 运算符用于将数据写入文件流。
  • std::ifstream 用于创建一个输入文件流,打开文件进行读取操作。
  • std::getline 函数用于从文件流中读取一行数据。

三、文件描述符与文件流指针的转换

        有时候,我们可能需要在文件描述符和文件流指针之间进行转换。C++ 标准库提供了 fdopen 和 fileno 函数来实现这种转换。

3.1 文件描述符转换为文件流指针

#include <iostream>
#include <fcntl.h>
#include <unistd.h>
#include <cstdio>

int main() {
    // 打开文件获取文件描述符
    int fd = open("test_convert.txt", O_RDWR | O_CREAT, 0666);
    if (fd == -1) {
        perror("open");
        return 1;
    }

    // 将文件描述符转换为文件流指针
    FILE* fp = fdopen(fd, "r+");
    if (fp == nullptr) {
        perror("fdopen");
        close(fd);
        return 1;
    }

    // 使用文件流指针进行操作
    fprintf(fp, "Converted from file descriptor.");
    fflush(fp);

    // 关闭文件流指针
    fclose(fp);

    return 0;
}

3.2 文件流指针转换为文件描述符

#include <iostream>
#include <fstream>
#include <unistd.h>

int main() {
    // 打开文件获取文件流指针
    std::ofstream outfile("test_convert_back.txt");
    if (!outfile.is_open()) {
        std::cerr << "Failed to open file." << std::endl;
        return 1;
    }

    // 将文件流指针转换为文件描述符
    int fd = fileno(outfile.rdbuf());
    if (fd == -1) {
        std::cerr << "Failed to get file descriptor." << std::endl;
        outfile.close();
        return 1;
    }

    // 使用文件描述符进行操作
    const char* data = "Converted back to file descriptor.";
    ssize_t bytes_written = write(fd, data, sizeof(data));
    if (bytes_written == -1) {
        perror("write");
        outfile.close();
        return 1;
    }

    outfile.close();

    return 0;
}

四、总结

        文件描述符和文件流指针是 C++ 中进行文件操作的两种重要方式。文件描述符是操作系统层面的概念,提供了底层、高效的文件操作接口;而文件流指针是 C++ 标准库层面的抽象,提供了更高级、更面向对象的文件操作方式。在实际编程中,我们可以根据具体需求选择合适的方式,也可以利用它们之间的转换来实现更灵活的文件操作。希望通过本文的介绍,你对文件描述符和文件流指针有了更深入的理解,能够在编程中更加得心应手地进行文件操作。

        以上就是本次关于文件描述符与文件流指针的探索之旅,希望大家在编程的道路上越走越远,不断发现新的乐趣和挑战!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安大小万

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值