我如何将 ifstream 和 ofstream 传递给 C++ 中的相同函数对象?

how can i pass ifstream and ofstream to same function objects in C++?

我的用例是创建一个函数,该函数接受一个 fileName 和一个 ifsttream/ofstream 对象,然后在给定的文件流对象中相应地为 reading/writing 打开文件。还要检查操作是否成功,如果成功,returns 文件流对象。

我的实现如下,是基于ifstream和ofstream都派生自fstream的假设。

#include <iostream>
#include <fstream>
using namespace std;
void populate_filehandles(const string &inFileName, fstream &filehandle) {
    filehandle.open(inFileName);
    if (!filehandle.is_open()) {
            cout << "input file : " << inFileName << " could not be opened" << endl;
            exit(0);
        }
}
int main () {
    ifstream inFile;
    string inFileName = "abc.txt";
    populate_filehandles(inFileName, inFile);
}

代码报错ifstream cannot be converted to fstream。还有其他方法可以解决这个问题吗?

所以,正如其他人所建议的,这是因为 std::ifstream 没有继承自 std::fstream。相反,it inherits from std::istresm instead. std::fstream on the other hand inherits from std::iostream。所以你不能真的那样做。

您必须解决的一些选项:

  1. 模板(正如其他人提到的):
template <class T> void populate_filehandles(const string &inFileName, T &filehandle)
  1. 过载:
void populate_filehandles(const string &inFileName, std::ifstream &filehandle)
void populate_filehandles(const string &inFileName, std::ofstream &filehandle)

然而,这将要求您实现相同的功能两次。不一定是最好的主意,但会奏效。

  1. 传递旗帜

std::fstream 的一个有趣之处在于它能够打开文件进行读取或写入(我认为甚至两者兼而有之)。所以,理论上,你可以添加一个标志来说明你想打开它的方向:

void populate_filehandles(const string &inFileName, fstream &filehandle, bool reading) {
    if(reading) {
        filehandle.open(inFileName, std::ios::in);
    } else {
        filehandle.open(inFileName, std::ios::out);
    }
    //...
}