Существует три основных проблемы с этим кодом, две из них здесь:
while (!file.eof())
{
file >> temp_list[index];
index++;
}
Вы не можете проверить file.eof()
, чтобы увидеть, если операция next не будет выполнена, только если previous нажмет eof, и это обычно полезно только в случае неудачи, поэтому измените ее на :
while (file >> temp_list[index]) {
index++;
}
Поскольку извлечения (>>
) возвращают поток, и поток можно тестировать напрямую, этот код теперь проверяет поток на каждой итерации и увеличивает индекс только в случае успешного извлечения.
Теперь при извлечении в массив символов входные потоки останавливаются на пробелах, но они не знают, какую максимальную длину они могут хранить, пока вы им не скажете. Эта же ошибка позже в коде, вероятно, объясняет то, что вы делаете, потому что я подозреваю, что вы читаете гораздо больше данных, чем ожидаете, и таким образом растоптываете всю свою память. Исправлено:
while (file >> std::setw(15) >> temp_list[index]) {
index++;
}
Тем не менее, последняя серьезная проблема заключается в том, что вы выделяете ресурсы и пропускаете их, поэтому вместо них используйте vector и string:
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
void init() {
typedef std::vector<std::string> C; // for later convenience
C words;
{
ifstream file ("en_US.dic");
if (!file) {
std::cerr << "could not open file\n";
// handle error: throw an exception, call abort(), etc.
}
for (std::string word; file >> word;) {
words.push_back(word);
}
// if you want to read lines instead:
//for (std::string line; std::getline(file, line);) {
// words.push_back(line);
//}
}
// now use words[0] through words[words.size() - 1]
std::cout << "Read " << words.size() << " words:\n";
for (int i = 0; i < words.size(); ++i) {
std::cout << " " << words[i] << '\n';
}
std::cout << "Output again:\n";
for (C::const_iterator i = words.begin(); i != words.end(); ++i)
{
std::cout << " " << *i << '\n';
}
}