分段故障(core dumped)读取行到数组

时间:2015-06-30 02:27:09

标签: c++ segmentation-fault

我正在尝试将文件读入数组,以便我可以将数组处理为选择排序。但是当我尝试读取文件时,我收到了一个分段错误(核心转储)错误。这是我的代码:

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

    using namespace std;

    int main()
    {
        string array[40707];
        int loop = 0;
        int loop2;
        string line;
        ifstream inFile("beowulf.txt");
        if (inFile.is_open())
        {
            while(!inFile.eof())
            {
                getline(inFile, line);
                array[loop] = line;
                loop++;
            }
            inFile.close();
        }
        else cout <<  "Unable to open file" << endl;
        for (loop2 =0; loop2 <= loop; loop2++)
            cout << array[loop2] << endl;
        return 0;
    }

2 个答案:

答案 0 :(得分:1)

将字符串数组更改为:

std::vector<std::string> array;

然后你可以读取文件并将其复制到矢量中:

std::copy(std::istream_iterator<std::string>(inFile),
          std::istream_iterator<std::string>(),
          std::back_inserter(array));

编辑:要逐行阅读文件,请定义您自己的insert_iterator或者这样做:

std::string line;
while (getline(inFile, line))
    array.push_back(line);

您的代码将更改为此类

#include <bits/stdc++.h>
using namespace std;

int main() {
    vector<string> array;
    string line;
    ifstream inFile("beowulf.txt");
    if (!inFile.is_open()) {
        cerr <<  "Unable to open file" << endl;
        return 1;
    }
    while (getline(inFile, line))
        array.push_back(line);
    inFile.close();

    for (int i = 0; i < array.size(); ++i)
        cout << array[i] << endl;
    return 0;
}

答案 1 :(得分:1)

我可以立即看到两个潜在的错误案例。

超越数组末尾的结尾。它可能在阅读时发生,因为循环没有保护。如果读取的数组恰好是40707行,则在loop2 == loop时打印出来时会发生。这些中的任何一个都可能是段错误的原因。推荐的解决方案是使用C ++的std :: vector,因为它会自动调整输入大小并自动迭代存储的项目。

第二个错误不太严重,但允许在IO错误上进行无限循环。如果错误阻止读取行并将流置于错误状态,则可能永远不会到达文件末尾。与getline不太相似,但是格式化读取时常见。

使用OP的大部分解决方案:

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

using namespace std;

int main()
{
    vector<string> array; // vector eliminates buffer overflow problem of string array.
    //int loop = 0; vector also eliminates the need for this counter
    //int loop2; and this one
    string line;
    ifstream inFile("beowulf.txt");
    if (inFile.is_open())
    {
        while(getline(inFile, line)) //exits if anything goes wrong with the file IO
        {
            array.push_back(line); // stores line in vector
        }
        inFile.close();
    }
    else cout <<  "Unable to open file" << endl;

// C++11 way    
    for (string const & str: array)
    { // iterates through the string automatically
        cout << str << endl;
    }
/* Old C++ way
    for (vector<string>::iterator str = array.begin(); 
         token != array.end();
         ++token)
    { // iterates through the string manually
        cout << *str << endl;
    }
*/
    return 0;
}