我如何将 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
。所以你不能真的那样做。
您必须解决的一些选项:
- 模板(正如其他人提到的):
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);
}
//...
}
我的用例是创建一个函数,该函数接受一个 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
。所以你不能真的那样做。
您必须解决的一些选项:
- 模板(正如其他人提到的):
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);
}
//...
}