2

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

请看下面的代码。它所做的只是循环 20 次并将循环的索引写入文件。每 3 次写入文件后,该文件关闭并启动一个新文件(使用 IF 循环检查 3 次写入。

它适用于第一个文件并按预期写入。然后 IF 第一次启动并关闭当前文件并启动新文件。

注意:此时我可以很好地写入新文件。

然后 IF 结束并将处理返回到 FOR 循环。但是现在写入文件不起作用(没有错误,没有写入)。

因此,该文件在创建它的 IF 块中成功写入。然后 IF 块结束。然后 FOR 循环结束当前的 pass 并开始一个新的 pass。现在写不出来了。

任何人都可以帮忙,我可以找到方法来做我需要做的不同的事情,但我只是想了解为什么会这样?

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,";
        }
    }
}
4

2 回答 2

8

创建新文件时,您要ofstream fsTestOutput在语句中声明第二个。if

第二个ofstream具有本地if声明的范围,因此它可以在您的if. 但是,当您离开if语句并返回for循环时,新的 ofstream 实例超出范围,并且您的代码恢复为使用原始实例(您已关闭,因此没有输出!)

  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,";
  } 
于 2011-04-20T09:16:48.237 回答
4

尝试删除ofstream fsTestOutput;循环内的行,基本上你是在错误的范围内创建一个 ofstream 。

于 2011-04-20T09:16:40.753 回答