嗨,你们所有优秀的程序员。
我一直在尝试将std::cout
重定向到文件,以便例如在执行代码时
std::cout << "hello" << std::endl;
这个词&#34;你好&#34;将被写入我重定向到的文件。
我有以下程序:
// Redirection.cpp
#include <iostream>
#include <fstream>
int main(int argc, char **argv) {
if(argc == 2){
std::cout << "Output file supplied, redirecting to output.txt" << std::endl;
std::ofstream out("C:\\Avner\\HUJI\\CPP\\ex2\\output.txt");
std::cout.rdbuf(out.rdbuf());
std::cout << "This file contains output of Redirection.cpp" << std::endl;
}
std::cout << "This should be displayed in console or in the output file, if supplied" << std::endl;
return 0;
}
我期待output.txt
阅读:
This file contains output of Redirection.cpp
This should be displayed in console or in the output file, if supplied
但它只读取:
This file contains output of Redirection.cpp
我认为我使用的重定向仅适用于该范围,而不适用于任何外部范围。
我该如何解决这个问题?我需要的行为是,只有在提供输出文件时,所有打印都将写入该文件而不是控制台。
感谢一大堆免费帮助爱和支持!
答案 0 :(得分:4)
#include <iostream>
#include <fstream>
int main(int argc, char **argv) {
if(argc == 2){
std::cout << "Output file supplied, redirecting to output.txt" << std::endl;
std::ofstream out("C:\\Avner\\HUJI\\CPP\\ex2\\output.txt");
std::cout.rdbuf(out.rdbuf());
std::cout << "This file contains output of Redirection.cpp" << std::endl;
}
std::cout << "This should be displayed in console or in the output file, if supplied" << std::endl;
return 0;
}
回想一下,out
是自动存储持续时间的对象。因此,在&#34; }
&#34;就在您上一次std::cout
操作之前,out
被销毁(结果是,缓冲区和文件资源被释放)。
因此,为了确保流缓冲区仍然有效,请保持out
活着。如果有一种方法,请参阅Barmar's answer。
答案 1 :(得分:3)
在cout
之外声明if
变量,以便在if
结束时它不会超出范围。
int main(int argc, char *argv[]) {
std::ofstream out;
if (argc == 2) {
std::cout << "Output file supplied, redirecting to output.txt" << std::endl;
out.open("C:\\Avner\\HUJI\\CPP\\ex2\\output.txt");
std::cout.rdbuf(out.rdbuf());
std::cout << "This file contains output of Redirection.cpp" << std::endl;
}
std::cout << "This should be displayed in console or in the output file, if supplied" << std::endl;
if (out.is_open()) {
out.close();
}
return 0;
}