我的C++循环不能正常工作,我不知道为什么

np8igboo  于 2022-12-20  发布在  其他
关注(0)|答案(2)|浏览(169)

我试着写一个程序,复制(从input.txt文件)30行到一个文件,然后循环和复制下一个30行到第二个文件,然后下一个30行到第三个文件,等等。这是我写的尝试,使之成为现实:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    // initialize
    ifstream input("input.txt");
    string line;
    int i = 0;
    int fileNum = 0;
    cout << "Initialized";

    // Loop through text file and write to new files
    while (getline(input, line) && i < 30)
    {
        // Write to File
        ofstream outFile("frames/frame" + to_string(fileNum) + ".mcfunction");

        // Write Lines
        outFile << "data modify block " << (i + 1) << " -48 20 HeldItem.Item.tag.display.Name set value '{\"text\":\"" << line << "\"}'" << endl;

        // Increment Counters
        i++;
        if (i == 30)
        {
            //  Add Schedule and Scoreboard Commands to Bottom of Each File
            outFile << "scoreboard players set Frame: BadApple " + to_string(fileNum) << endl;
            outFile << "schedule frame" + to_string(fileNum + 1) + ".mcfunction 5s" << endl;

            // Reset Counter & File Number
            i = 0;
            fileNum++;
            cout << i << " ";

        }
    }

    return 0;
}

但它最终只将输入文件中的一行复制到每个文档中。除此之外,一切似乎都在正常工作。
任何帮助将不胜感激,我一直在尝试调试这一段时间了,但作为一个天真的初学者,我还没有走得很远。谢谢大家提前。

c7rzv4ha

c7rzv4ha1#

问题是您是每行打开和关闭一次输出文件,而不是每30行打开和关闭一次。
我建议你重组你的程序使用嵌套循环。外层循环应该处理一个输出文件(即30行)每循环迭代,内层循环应该处理一个单行每循环迭代。
下面是一个例子:

#include <iostream>
#include <fstream>
#include <string>

int main()
{
    std::ifstream input( "input.txt" );
    std::string line;
    int fileNum = 0;
    bool finished = false;

    std::cout << "Initialized\n";    

    //process one file per loop iteration
    for ( int fileNum = 0; !finished; fileNum++ )
    {
        //open new output file
        std::ofstream outFile("frames/frame" + std::to_string(fileNum) + ".mcfunction");

        //process one line per loop iteration
        for ( int i = 0; i < 30; i++ )
        {
            if ( !std::getline(input, line) )
            {
                finished = true;
                break;
            }

            //write lines
            outFile << "data modify block " << (i + 1) << " -48 20 HeldItem.Item.tag.display.Name set value '{\"text\":\"" << line << "\"}'\n";
        }

        //add schedule and scoreboard commands to bottom of each file
        outFile << "scoreboard players set Frame: BadApple " + std::to_string(fileNum) << '\n';
        outFile << "schedule frame" + std::to_string(fileNum + 1) + ".mcfunction 5s\n";
    }

    return 0;
}

请注意,在上面的代码中,我删除了using namespace std;,原因如下:
Why is "using namespace std;" considered bad practice?
另外,如果你想真正刷新缓冲区,你通常应该只使用std::endl。否则,你可以简单地打印"\n",这对性能更好。更多信息请参见下面的问题:
"std::endl" vs "\n"
因此,我从程序中删除了std::endl

vwhgwdsa

vwhgwdsa2#

你在每次循环的时候都要重新打开这个文件,所以它会一直覆盖第一行。

相关问题