2014-02-25 49 views
1
class Read 
{ 
public: 
    Read(ifstream &file) 
    { 
     mFile=file; 
    } 
private: 
    ifstream mFile; 
    string str; 
}; 


int main() 
{ 
    Read r("sample.txt"); 

    return 0; 
} 

我试图使用构造函数来读取文件。我看到堆栈溢出的另一个例子,并试图复制它,但失败了。我如何正确读取使用构造函数的文件。 语法是否关闭?将文件传递给构造函数以读取

+0

首先,'''sample.txt“'不是'ifstream'。需要在某个地方创建其中一个,然后使用它。 – 2014-02-25 21:33:49

+0

SO上的例子? – user1810087

+0

http://stackoverflow.com/questions/16096109/passing-ifstream-as-an-argument-to-class-constructor这是我找到的例子 – user3239138

回答

1

您不能复制或分配ifstreams,但可以从字符串文字初始化它们。所以,你可以这样做:

class Read 
{ 
public: 
    Read(const char* filename) : mFile(filename) {} 
private: 
    ifstream mFile; 
    string str; 
}; 

注意,这将使Read不可复制和不可转让。但移动建设和移动分配将工作。

请注意,如果您确实想要传递ifstream,那么您可以做的最好做法是传递临时数据,并使用数据成员的移动构造函数。您可以使用此构造实现它:

Read(ifstream&& file) : mFile(std::move(file)) {} 

用法:

Read r1("file.txt");    // const char* ctor 
Read r2(std::ifstream("file2.txt"); // ifstream&& ctor 
1

“Sample.txt的” 不是一个ifstream的。相反,用传递的字符串打开文件。

mFile.open(file); 其中file是一个c字符串。

0

无法复制标准文件流。构造函数中的赋值调用流的私有(C++ 11中的delete'd)复制赋值运算符。这样做的正确方法是用成员初始值设定项列表调用相应的构造函数。参数的类型也应该是std::string

Read(const std::string& file) 
    : mFile(file) 
// ^^^^^^^^^^^^^ 
{ }