C++ C++;气流未按预期运行
我有一种感觉,我遗漏了一些明显的东西,但似乎无法解决以下问题: 请参阅下面的代码。它只需循环20次,然后将循环的索引写入文件。在每三次写入文件后,该文件关闭并启动一个新文件(使用检查三次写入的IF循环) 对于第一个文件,它可以正常工作,并按预期写入。然后,IF第一次启动,当前文件关闭,新文件启动 注意:此时我可以很好地写入新文件 然后IF结束并将处理返回到FOR循环。但是现在写入文件不起作用(没有错误,没有写入任何内容) 因此,文件在创建它的IF块中成功写入。然后IF块结束。然后FOR循环结束当前过程并开始新过程。现在写入不起作用 有人能帮我吗?我能找到不同的方法来做我需要做的事情,但我只是想了解为什么会发生这种情况C++ C++;气流未按预期运行,c++,ofstream,C++,Ofstream,我有一种感觉,我遗漏了一些明显的东西,但似乎无法解决以下问题: 请参阅下面的代码。它只需循环20次,然后将循环的索引写入文件。在每三次写入文件后,该文件关闭并启动一个新文件(使用检查三次写入的IF循环) 对于第一个文件,它可以正常工作,并按预期写入。然后,IF第一次启动,当前文件关闭,新文件启动 注意:此时我可以很好地写入新文件 然后IF结束并将处理返回到FOR循环。但是现在写入文件不起作用(没有错误,没有写入任何内容) 因此,文件在创建它的IF块中成功写入。然后IF块结束。然后FOR循环结束当
int main()
{
unsigned int test_rowcounter = 0;
unsigned int test_filenumber = 0;
char filenamebuilder[50] = "";
sprintf(filenamebuilder, "testing_file%d",test_filenumber);
strcat(filenamebuilder,".tsv");
ofstream fsTestOutput;
fsTestOutput.open(filenamebuilder, fstream::out);
//Loop 20 times writibng the loop index value to a file
for(unsigned int f=0;f<20;f++)
{
fsTestOutput << f; //This write only works for the original file
test_rowcounter++;
//If three rows have been written to a file then start a new file
if(test_rowcounter == 3)
{
test_rowcounter = 0;
test_filenumber++; // increment the number that is added to the
// base filename to create a new file
//Close the previous file and open a new one
fsTestOutput.close();
sprintf(filenamebuilder, "testing_file%d",test_filenumber);
strcat(filenamebuilder,".tsv");
ofstream fsTestOutput;
fsTestOutput.open(filenamebuilder, fstream::out);
// This next line works, the data is written
// for all files at this point
fsTestOutput << "FILE JUST CHANGED,";
}
}
}
intmain()
{
无符号整数测试_rowcounter=0;
无符号整数测试文件号=0;
char filenamebuilder[50]=“”;
sprintf(文件名生成器,“测试文件%d”,测试文件号);
strcat(filenamebuilder,“.tsv”);
流测试输出;
打开(filenamebuilder,fstream::out);
//循环20次将循环索引值写入文件
对于(unsigned int f=0;f尝试从循环中删除ofstream fsTestOutput;行,基本上是在错误的范围内创建ofstream。创建新文件时,您在if
语句中声明了第二个ofstream fsTestOutput
第二个ofstream
的作用域位于if
语句的局部,因此它在if
语句中可以正常工作。但是,当您离开if
语句并返回for
循环时,新的ofstream实例将超出作用域,您的代码将恢复使用原始实例(您已关闭,因此没有输出!)
if(测试行计数器==3)
{
测试计数器=0;
test_filenumber++;
//关闭上一个文件并打开一个新文件
fsTestOutput.close();
sprintf(文件名生成器,“测试文件%d”,测试文件号);
strcat(filenamebuilder,“.tsv”);
ofstream fsTestOutput;//去掉这个
打开(filenamebuilder,fstream::out);
fsTestOutput感谢您的帮助,确实解决了这个问题。我不知道语句是否有自己的作用域。@Columbo:{
和}
中的任何内容都是它自己的作用域。您可以使用{…}
构造没有if
,while
或for
。如果它不是它自己的范围,那么你就会有重新声明的错误。:)谢谢,我刚刚读了一些书,可以看到你在说什么。我在用PHP思考,这(我想)没有if语句的空间。谢谢Saskiha,我看到你的回答和我已经勾选的razlebe的回答一样。@Columbo他坐在离我办公桌三英尺远的地方。我给他买杯咖啡。:)
if(test_rowcounter == 3)
{
test_rowcounter = 0;
test_filenumber++;
//Close the previous file and open a new one
fsTestOutput.close();
sprintf(filenamebuilder, "testing_file%d",test_filenumber);
strcat(filenamebuilder,".tsv");
ofstream fsTestOutput; // GET RID OF THIS
fsTestOutput.open(filenamebuilder, fstream::out);
fsTestOutput << "FILE JUST CHANGED,";
}