как передать ifstream и ofstream одним и тем же объектам функций в C ++? - PullRequest
1 голос
/ 08 мая 2020

Мой вариант использования - создать функцию, которая принимает имя файла, объект ifsttream / ofstream и затем открывает файл для чтения / записи соответственно в данном объекте файлового потока. также, чтобы проверить, была ли операция успешной, и в случае успеха возвращает объект файлового потока.

Моя реализация следующая и основана на предположении, что как 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 не может быть преобразована в fstream . есть ли другой способ решить проблему?

1 Ответ

0 голосов
/ 22 мая 2020

Итак, как предполагали другие, это связано с тем, что std::ifstream не наследуется от std::fstream. Вместо этого наследуется от std::istresm. std::fstream с другой стороны, наследуется от std::iostream. Так что вы не можете этого сделать.

Некоторые параметры, которые вам нужно обойти:

  1. Шаблоны (как уже упоминалось другими):
template <class T> void populate_filehandles(const string &inFileName, T &filehandle)
Перегрузка:
void populate_filehandles(const string &inFileName, std::ifstream &filehandle)
void populate_filehandles(const string &inFileName, std::ofstream &filehandle)

Однако это потребует от вас реализации одной и той же функции дважды. Не обязательно лучшая идея, но будет работать.

Передать флаг

Что-то интересное в 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);
    }
    //...
}
...