C++ C++;气流未按预期运行

C++ C++;气流未按预期运行,c++,ofstream,C++,Ofstream,我有一种感觉,我遗漏了一些明显的东西,但似乎无法解决以下问题: 请参阅下面的代码。它只需循环20次,然后将循环的索引写入文件。在每三次写入文件后,该文件关闭并启动一个新文件(使用检查三次写入的IF循环) 对于第一个文件,它可以正常工作,并按预期写入。然后,IF第一次启动,当前文件关闭,新文件启动 注意:此时我可以很好地写入新文件 然后IF结束并将处理返回到FOR循环。但是现在写入文件不起作用(没有错误,没有写入任何内容) 因此,文件在创建它的IF块中成功写入。然后IF块结束。然后FOR循环结束当

我有一种感觉,我遗漏了一些明显的东西,但似乎无法解决以下问题:

请参阅下面的代码。它只需循环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,";
  }