这里我展示了我的C ++代码片段,它循环了一些k值,如果k = 0,则应该将输出发送到一个文件(outputk0.txt)
,如果k!= 0则发送到另一个文件({{1}编译时我遇到了outputnotk0.txt
ofstream文件的范围问题。有谁知道如何解决这个问题?
out
答案 0 :(得分:1)
这应该解决它:
std::unique_ptr<std::ofstream> out;
if(k == 0)
out = new std::ofstream("outputk0.txt", ios::out);
else
out = new std::ofstream("outputnotk0.txt", ios::out);
你必须写
*out << i << " " << j << " " << cv.U(z,k) << endl;
当然是。
如评论中所述,另一个选项是使用open()
函数:
std::ofstream out;
if(k == 0)
out.open("outputk0.txt", ios::out);
else
out.open("outputnotk0.txt", ios::out);
答案 1 :(得分:1)
你可以通过几种方式解决。 可能的解决方案#1:
在std::ofstream
语句的顶部声明if
,并调用open
方法打开该文件。
std::ofstream out;
if(k == 0)
out.open("outputk0.txt", ios::out);
else
out.open("outputnotk0.txt", ios::out);
可能的解决方案(家庭)#2:
使用if-else
将文件名存储在字符串中,用于传递给std::ofstream
构造函数:
1
std::ofstream out(k == 0 ? "outputk0.txt" : "outputnotk0.txt", ios::out);
2
std::string fileName;
if (k == 0)
fileName = "outputk0.txt";
else // more if cases if needed..
fileName = "outputnotk0.txt";
std::ofstream out(fileName, ios::out); // use fileName.c_str () if not using C++-11.
3
std::string fileName;
switch (k)
{
case 0:
fileName = "outputk0.txt";
break;
// More cases if needed..
default:
fileName = "outputnotk0.txt";
}
std::ofstream out(fileName, ios::out); // use fileName.c_str () if not using C++-11.
答案 2 :(得分:0)
标识符必须在编译时定义(特定类型)这就是我们无法在运行时创建新类型的原因。
在您的情况下,您正在创建一个对象&#34; out&#34;限制在某种条件下,因此请记住,即使条件成功,标识符也不能在声明范围之外使用。
举个例子:
if(1) // always true condition
int a = 0;
std::cout << a; // you get a compile-time error undeclared identifier
只有当你只需要在那个范围内的变量时,你才可以做这样的事情:
if(SomConditionIsTrue){
int var;
std::cin >> var;
std::cout << var;
}
考虑这个例子:
#if(true)
std::ofstream out("data.txt");
#endif
out << "To be written into file"; // now it works
#if(false)
std::ofstream out("data.txt");
#endif
out << "To be written into file"; // now it doesn't work because the condition fails so no `out` is declared consequently not added by the pre-processor.
在你的情况下声明一个外面的对象然后在某些条件下初始化它:
std::ofstream out("outputk0.txt", ios::out);
for(;;){
out << "something"; // out is visible here. the compiler looks up and sees it.
}