Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将ifstream和ofstream传递给C++;?_C++_C++14_Fstream_Ifstream_Fileopener2 - Fatal编程技术网

C++ 如何将ifstream和ofstream传递给C++;?

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

我的用例是创建一个函数,该函数接受一个文件名、一个ifststream/ofstream对象,然后在给定的filestream对象中打开相应的文件进行读/写。还要检查操作是否成功,如果成功,则返回filestream对象

我的实现如下所示,并且基于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);
}

#包括
#包括
使用名称空间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);
        }
        //...
    }