C++ 如何将ifstream和ofstream传递给C++;?
我的用例是创建一个函数,该函数接受一个文件名、一个ifststream/ofstream对象,然后在给定的filestream对象中打开相应的文件进行读/写。还要检查操作是否成功,如果成功,则返回filestream对象 我的实现如下所示,并且基于ifstream和ofstream都派生自fstream的假设C++ 如何将ifstream和ofstream传递给C++;?,c++,c++14,fstream,ifstream,fileopener2,C++,C++14,Fstream,Ifstream,Fileopener2,我的用例是创建一个函数,该函数接受一个文件名、一个ifststream/ofstream对象,然后在给定的filestream对象中打开相应的文件进行读/写。还要检查操作是否成功,如果成功,则返回filestream对象 我的实现如下所示,并且基于ifstream和ofstream都派生自fstream的假设 #include <iostream> #include <fstream> using namespace std; void populate_filehand
#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);
}
#包括
#包括
使用名称空间std;
void填充文件句柄(常量字符串和填充名、fstream和文件句柄){
filehandle.open(inFileName);
如果(!filehandle.is_open()){
正如其他人所建议的,这是因为std::ifstream
并不是从std::fstream
继承的,而是从另一方面来说。std::fstream
继承的。所以你不能真正做到这一点
您必须解决的一些选项:
模板(如其他人所述):
然而,这将要求您实现相同的功能两次。这不一定是最好的主意,但会奏效
传旗
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);
}
//...
}
因此,正如其他人所建议的,这是因为std::ifstream
并不是从std::fstream
继承的,而是从另一方面来说。std::fstream
继承的。所以你不能真正做到这一点
您必须解决的一些选项:
模板(如其他人所述):
然而,这将要求您实现相同的功能两次。这不一定是最好的主意,但会奏效
传旗
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);
}
//...
}
我认为处理流和ifstream(若可能的话)不是一个好的设计在同一个函数中。如果使用模板函数,它可能会起作用。如果您通过引用将流传递到函数中,为什么还需要返回它呢?只需将函数返回类型更改为void
。现在唯一要解决的问题是错误消息,此时称为“input file”这不一定是真的。该代码不会产生该消息。请发布。您可能希望验证您的假设,即ifstream
和of stream
都来自fsstream
。意外通常是由一个或多个假设错误引起的。@VisheshArya让我们明确一下,ifstream
继承自istream
,ofstream
继承自ostream
,fstream
继承自iostream
。因此当前编写的代码无法工作。我认为处理Stream和ifstream(如果可能的话)不是一个好的设计在同一个函数中。如果使用模板函数,它可能会起作用。如果您通过引用将流传递到函数中,为什么还需要返回它呢?只需将函数返回类型更改为void
。现在唯一要解决的问题是错误消息,此时称为“input file”这不一定是真的。该代码不会产生该消息。请发布。您可能希望验证您的假设,即ifstream
和of stream
都来自fsstream
。意外通常是由一个或多个假设错误引起的。@VisheshArya让我们明确一下,ifstream代码>继承自istream
,ofstream
继承自ostream
,fstream
继承自iostream
。因此当前编写的代码无法工作。
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);
}
//...
}