【发布时间】:2013-10-21 11:02:06
【问题描述】:
下面是两段代码。一个有效,一个无效,我想知道为什么。对于缺少 cmets 和糟糕的变量名,我提前道歉,但现在这种语言真的让我很吃力。
// File1.cpp (contains relevant includes)
// Works! It writes to out.txt and appears to use in.txt correctly
int main(int argc, char* argv[]) {
int num;
std::ifstream in("in.txt");
std::streambuf* cinbuf = std::cin.rdbuf();
std::cin.rdbuf(in.rdbuf());
std::ofstream out("out.txt");
std::streambuf* coutbuf = std::cout.rdbuf();
std::cout.rdbuf(out.rdbuf());
cout << "Give me a number: ";
cin >> num;
std::cin.rdbuf(cinbuf);
std::cout.rdbuf(coutbuf);
return 0;
}
// File2.cpp (contains relevant includes)
// Does not work! Outputs nothing to out.txt.
class TestWithStdIO {
std::streambuf* cinbuf;
std::streambuf* coutbuf;
public:
TestWithStdIO(const char* inFile, const char* outFile) {
std::ifstream in(inFile);
cinbuf = std::cin.rdbuf();
std::cin.rdbuf(in.rdbuf());
std::ofstream out(outFile);
coutbuf = std::cout.rdbuf();
std::cout.rdbuf(out.rdbuf());
}
~TestWithStdIO() {
std::cin.rdbuf(cinbuf);
std::cout.rdbuf(coutbuf);
}
};
int main(int argc, char* argv[]) {
int num;
TestWithStdIO* ioTest = new TestWithStdIO("in.txt", "out.txt");
cout << "Give me a number: ";
cin >> num;
delete ioTest;
return 0;
}
【问题讨论】:
-
in和out仅存在于构造函数调用中的堆栈上。一旦构造函数完成,它们就会“死亡”。也许也让它们成为成员变量(并将文件名传递给initializer list 以打开它们)。 -
@BoBTFish 您应该回答这个问题,因为它是出了什么问题。 (嗯,他动态分配
TestWithStdIO也是不对的。TestWithStdIO基本上是RAII,RAII和动态分配对我来说似乎是矛盾的。) -
@JamesKanze 更不用说这样的原始指针不是异常安全的。
-
@BoBTFish 不错!太感谢了!让它成为一个答案,我会接受它:)
-
@syam 所以你会把它变成一个智能指针?管理 RAII 类的 RAII 类?几乎按照定义,不应动态分配 RAII 类。
标签: c++ ifstream cout cin ofstream