[英]Why does this code not switch cin and cout with file streams?
以下是兩段代碼。 一種有效,一種無效,我想知道為什么。 對於缺少注釋和糟糕的變量名,我事先表示歉意,但是現在,這種語言確實使我精疲力盡。
// 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;
}
在TestWithStdIO::TestWithStdIO()
,由in.rdbuf()
指向的流緩沖區與in
(即,在構造函數的末尾in.rdbuf()
一起被銷毀。
std::[io]fstreams
和out
的std::[io]fstreams
in
TestWithStdIO
構造函數中具有局部作用域(或自動存儲持續時間 )。 在函數的結尾,它們連同它們所包含的緩沖區一起被銷毀(並關閉了文件),在cin
和cout
內留下了懸空的指針。
考慮而不是使in
和out
成員TestWithStdIO
,是這樣的:
class TestWithStdIO {
std::streambuf* cinbuf;
std::streambuf* coutbuf;
std::ifstream in_; // <-- member
std::ofstream out_; // <-- member
public:
TestWithStdIO(const std::string& inFile, const std::string& outFile) :
in_(inFile), out_(outFile) // <-- initializer list
{
cinbuf = std::cin.rdbuf();
std::cin.rdbuf(in_.rdbuf());
coutbuf = std::cout.rdbuf();
std::cout.rdbuf(out_.rdbuf());
}
~TestWithStdIO() {
std::cin.rdbuf(cinbuf);
std::cout.rdbuf(coutbuf);
}
};
如果僅支持C++03
out
則可能需要in(inFile.c_str())
和等效的out
。
另外,如評論中所指出的,不需要動態分配TestWithStdIO
實例,實際上,它很可能是錯誤的來源。 做就是了
TestWithStdIO ioTest ("in.txt", "out.txt");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.