• C++
  • C++ 文件重定向与文件读写操作

  • @ 2024-7-24 22:58:12

C++ 文件重定向与文件读写操作教程 在C++中,文件重定向和文件读写操作是处理数据持久化和输入输出流的重要部分。以下将详细介绍这两个方面的基本概念、步骤和示例代码。

一、文件重定向 文件重定向是指将标准输入输出(stdin、stdout、stderr)重定向到文件或其他设备的过程。在C++中,这通常通过修改流的缓冲区(buffer)来实现。

  1. 使用rdbuf()方法 在C++中,cin、cout、cerr等流对象都提供了rdbuf()成员函数,用于获取或设置流的缓冲区。通过替换这些流的缓冲区,我们可以实现重定向。

cpp

#include <iostream>  
#include <fstream>  
  
int main() {  
    std::ifstream fin("input.txt");  
    std::ofstream fout("output.txt");  
  
    // 重定向cin和cout  
    std::streambuf* cinbuf = std::cin.rdbuf(fin.rdbuf());  
    std::streambuf* coutbuf = std::cout.rdbuf(fout.rdbuf());  
  
    // 现在,cin从input.txt读取,cout向output.txt写入  
    std::string line;  
    std::getline(std::cin, line); // 从input.txt读取一行  
    std::cout << line << std::endl; // 写入到output.txt  
  
    // 恢复标准输入输出  
    std::cin.rdbuf(cinbuf);  
    std::cout.rdbuf(coutbuf);  
  
    fin.close();  
    fout.close();  
    return 0;  
}
  1. 使用freopen()函数(C语言风格,但C++中也可使用) 虽然freopen()是C语言标准库函数,但在C++中同样可以使用。它允许你重新打开标准文件流,并将其连接到指定的文件。

cpp

#include <cstdio>  
  
int main() {  
    freopen("input.txt", "r", stdin);  
    freopen("output.txt", "w", stdout);  
  
    // 现在,scanf从input.txt读取,printf向output.txt写入  
    int a, b;  
    scanf("%d %d", &a, &b);  
    printf("%d\n", a + b);  
  
    // 恢复标准输入输出(在Windows上可能是freopen("CON", "r", stdin); freopen("CON", "w", stdout);)  
    fclose(stdin);  
    fclose(stdout);  
  
    return 0;  
}

注意:使用freopen()后,原来的stdin和stdout流会被关闭,因此在恢复时需要小心处理。

二、文件读写操作 在C++中,文件读写操作通常通过库中的ifstream(用于读文件)、ofstream(用于写文件)和fstream(同时支持读写)类来实现。

  1. 写文件 cpp
#include <fstream>  
#include <iostream>  
  
int main() {  
    std::ofstream ofs("example.txt");  
    if (!ofs.is_open()) {  
        std::cerr << "无法打开文件" << std::endl;  
        return 1;  
    }  
    ofs << "Hello, World!" << std::endl;  
    ofs.close();  
    return 0;  
}
  1. 读文件 cpp
#include <fstream>  
#include <iostream>  
#include <string>  
  
int main() {  
    std::ifstream ifs("example.txt");  
    if (!ifs.is_open()) {  
        std::cerr << "无法打开文件" << std::endl;  
        return 1;  
    }  
    std::string line;  
    while (getline(ifs, line)) {  
        std::cout << line << std::endl;  
    }  
    ifs.close();  
    return 0;  
}
  1. 二进制文件读写 对于二进制文件,需要指定ios::binary打开模式。

cpp

// 写二进制文件  
#include <fstream>  
#include <vector>  
  
class Data {  
public:  
    int id;  
    char name[100];  
};  
  
int main() {  
    std::ofstream ofs("data.bin", std::ios::out | std::ios::binary);  
    Data d = {1, "Example"};  
    ofs.write(reinterpret_cast<const char*>(&d), sizeof(d));  
    ofs.close();  
    return 0;  
}  

// 读二进制文件

#include <fstream>  
#include <iostream>  
  
int main() {  
    Data d;  
    std::ifstream ifs("data.bin", std::ios::in | std::ios::binary);  
    if (ifs.read(reinterpret_cast<char*>(&d), sizeof(d))) {  
        std::cout << "ID: " << d.id << ", Name: " << d.name << std::endl;  
    }  
    ifs.close();  
    return 0;  
}

总结 文件重定向和文件读写操作是C++编程中处理输入输出流和数据持久化的基本技能。通过合理使用库中的类和方法,以及理解标准输入输出流的重定向机制,可以高效地实现复杂的数据处理任务。

0 条评论

目前还没有评论...