簡體   English   中英

為什么此代碼不使用文件流切換cin和cout?

[英]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]fstreamsoutstd::[io]fstreams in TestWithStdIO構造函數中具有局部作用域(或自動存儲持續時間 )。 在函數的結尾,它們連同它們所包含的緩沖區一起被銷毀(並關閉了文件),在cincout內留下了懸空的指針。

考慮而不是使inout成員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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM