我正在尝试将文件读入数组,以便我可以将数组处理为选择排序。但是当我尝试读取文件时,我收到了一个分段错误(核心转储)错误。这是我的代码:
#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;
}
答案 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;
}