【问题标题】:Split text file into multiple files c++将文本文件拆分为多个文件c ++
【发布时间】:2014-12-02 14:48:18
【问题描述】:

我正在尝试将 txt 文件拆分为几个新文件。这就是我到目前为止所做的:

long c = 0;
string s;
vector<string> v;

我需要计算我的 txt 文件有多少行(它有效):

while(getline(inputFile, s, '\n')){
    v.push_back(s);
    c++;
}

long lineNumber = c;
long max = 100;

long nFiles;

检查将创建多少新文件:

if((lineNumber % max) ==0)
    nFiles = lineNumber/max;
else
    nFiles = lineNumber/max + 1; 

创建文件的新名称:

long currentLine = 0;

for(long i = 1; i <= nFiles; i++){
    stringstream sstream;
    string a_i;
    sstream <<i;
    sstream >> a_i;

    string outputfiles =  "name" +"_" + a_i  +".txt";

    ofstream fout(outputfiles.c_str());


    for (int j = currentLine; j<max; j++){
        fout << v[j]<<endl;                         
    }

    fout.close();
    currentLine = max;


}
inputFile.close();

它会创建文件但突然停止工作。有谁知道为什么?

【问题讨论】:

  • 您是否在调试器中运行过您的代码?它在代码中的什么地方停止工作?
  • 是的,我做到了。这是我得到的:“程序收到信号 sigsegv 分段错误”
  • 发生分段错误的地方应该有一个行号。
  • 就是那一行:fout
  • 当您在调试器中收到该消息时,您还会被告知是哪一行代码导致了问题。您有机会检查存储在变量中的值。听起来你现在能知道的最有价值的事情不是解决这个问题,而是如何使用调试器

标签: c++ split


【解决方案1】:

这是使用调试器可以帮助您的一个典型例子。

你在这里循环:

for (int j = currentLine; j<max; j++){
    fout << line[j]<<endl;                      
}

fout.close();
currentLine = max;
max = max + nMax; 

max 可以大于line 的大小,这会在您尝试访问line[j] 时导致分段错误。这个内部循环确实应该检查您没有超过line 的长度,您可以使用line.size() 找到它。即使在您修复此问题后,程序逻辑也不太正确,line 的大小似乎并没有增长,但在外部循环的每次迭代中,您对line 的访问会移动额外的max 索引,如果您不在line 末尾停止循环,这将始终在您尝试写入的最后一个文件中失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多