我试着写一个程序,复制(从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;
}
但它最终只将输入文件中的一行复制到每个文档中。除此之外,一切似乎都在正常工作。
任何帮助将不胜感激,我一直在尝试调试这一段时间了,但作为一个天真的初学者,我还没有走得很远。谢谢大家提前。
2条答案
按热度按时间c7rzv4ha1#
问题是您是每行打开和关闭一次输出文件,而不是每30行打开和关闭一次。
我建议你重组你的程序使用嵌套循环。外层循环应该处理一个输出文件(即30行)每循环迭代,内层循环应该处理一个单行每循环迭代。
下面是一个例子:
请注意,在上面的代码中,我删除了
using namespace std;
,原因如下:Why is "using namespace std;" considered bad practice?
另外,如果你想真正刷新缓冲区,你通常应该只使用
std::endl
。否则,你可以简单地打印"\n"
,这对性能更好。更多信息请参见下面的问题:"std::endl" vs "\n"
因此,我从程序中删除了
std::endl
。vwhgwdsa2#
你在每次循环的时候都要重新打开这个文件,所以它会一直覆盖第一行。