c++ 为什么循环不重复文件创建

uttx8gqw  于 2023-02-06  发布在  其他
关注(0)|答案(3)|浏览(168)

我刚接触c++,编写了以下代码来生成10个文件名递增的1 MB文件

#include <fstream>
#include <iostream>
#include <sstream>

using namespace std;

int main() {
    stringstream file_name_ss;

    std::ofstream file;
    for (int i = 0; i < 10; ++i) {
        file_name_ss << "file_" << i << ".ini";
        string file_name = file_name_ss.str();
        int size = 1024 * 1024 * 1; //~1MB
        file.open( file_name, ios::app);
        for (int x = 0; x < size; x++) {
            file << "a";
        }
    }
}

当我运行它的程序只有一个文件(file_0.txt)是生成.这第二个循环打破/转义第一?
我试着在网上查过了但没找到任何超过第一个文件的东西
编辑:我在内部循环中添加了file.close();行,使循环正常工作(谢谢Sam Varshavchik)。

#include <fstream>
#include <iostream>
#include <sstream>

using namespace std;

int main() {
    stringstream file_name_ss;

    std::ofstream file;
    for (int i = 0; i < 10; ++i) {
        file_name_ss << "file_" << i << ".ini";
        string file_name = file_name_ss.str();
        int size = 1024 * 1024 * 1; //~1MB
        file.open( file_name, ios::app);
        for (int x = 0; x < size; x++) {
            file << "a";
        file.close();
        }
    }
}

但我现在有一个新问题:现在文件名看起来像这样:

不是一个可怕的错误,但仍然有点烦人。我认为这与这部分有关:

file_name_ss << "file_" << i << ".ini";
ncgqoxb0

ncgqoxb01#

stringstream file_name_ss;
std::ofstream file;
for (int i = 0; i < 10; ++i) {
    file_name_ss << "file_" << i << ".ini";
    string file_name = file_name_ss.str();
    int size = 1; //~1MB
    file.open(file_name, ios::app);
    for (int x = 0; x < size; x++) {
        file << "a";
    }
    file.close();//close file before open new one 
    file_name_ss.str("");//clear stream
}
ao218c7q

ao218c7q2#

你需要在写完文件后关闭它,而且,你的代码没有清除之前的文件名,所以你只是不断地添加,把它添加到你的for循环的末尾。

file_name_ss.str("");
file.close();
8cdiaqws

8cdiaqws3#

你有 * 两 * 个问题,这实际上是同一个问题,但做了两次:您只有一个字符串和文件流对象,当循环迭代时,它们不会被“重置”。
例如,单个file对象只能打开 * 一次 *,任何不关闭它而再次打开它的尝试都将失败。
对于字符串流,每次迭代都会在你试图打开的文件名后面加上一个后缀,比如在第二次迭代中你会试图打开file_0.inifile_1.ini文件,以此类推。
解决这两个问题的简单方法是:将变量定义移动到循环 * 内部 *:

for (int i = 0; i < 10; ++i) {
    ostringstream file_name_ss;
    file_name_ss << "file_" << i << ".ini";

    std::ofstream file(file_name_ss.str());

    // ... Rest of loop...
}

[Note代码应该添加一些错误检查。]

相关问题