Ошибка шины (ядро сброшено) со связанными списками?

Я пишу программу, которая позволяет пользователю вводить имя файла базы данных пользователей для чтения; Затем программа создает связанный список объектов состояния и связанный список объектов-людей в каждой ссылке состояния, чтобы упорядочить информацию из файла.

Я знаю, что часть связанного списка работает, потому что я был в состоянии непосредственно кодировать имя файла и распечатывать список штатов и список людей в каждом штате; однако, когда я пытаюсь позволить пользователю ввести имя файла в качестве команды, я получаю ошибку шины. Когда я запускаю код в GDB, все, что он говорит мне, это:

Program received signal SIGBUS, Bus error.
0x280df0bd in std::operator>><char, std::char_traits<char> > ()
from /usr/lib/libstdc++.so.5

У меня даже нет номера строки, чтобы уйти! Любая помощь будет очень признательна. Вот команда и прочитайте части моего кода:

List<State*>* read(char* filename) {
string fname, lname, birthday, state;
int ssn;
List<State*>* state_list = new List<State*>();

ifstream file(filename);
if (file.fail()) {
cerr << "Error reading file.\n";
exit(1);
}

while (!file.eof()) {
file >> birthday >> ssn >> fname >> lname >> state;
Link<State*>* searchres = searchList(state, state_list);
Person* p = new Person(fname, lname, ssn, birthday, state);
if (searchres == NULL) // create new state
{
State* addedstate = state_list->addLink(new State(state))->data;
addedstate->res_list.addLink(p);
}

else // add to pre-existing state
{
searchres->data->res_list.addLink(p);
}
}
return state_list;
}

void main() {
string cmd;
cout << "Type your command in all lowercase letters.\n";
cin >> cmd;
if (cmd == "read") {
char* filnm;
cin >> filnm;
List<State*>* state_ls = read(filnm);
Link<Person*>* counter = state_ls->first->data->res_list.first;
while (counter != NULL) {
cout << counter->data->ssn << "\n";
counter = counter->next;
}
}
}

1

Решение

У вас сразу возникла проблема:

char* filnm;
cin >> filnm;

Указатель неинициализирован, но вы читаете информацию, используя этот указатель.

Либо использовать std::stringили массив символов соответствующего размера.

Использовать std::string в открытом файле:

std::string filnm;
cin >> filnm;
read(filnm.c_str());

Ваш read Функция также должна изменить параметр на const char* вместо char *, Вы не изменяете содержимое передаваемого массива символов, поэтому оно должно быть const,

Изменить: вам на самом деле не нужно использовать c_str()как std::string имеет конструктор, который принимает const char*, Тем не менее, измените параметр на const char *filename в read() функция.

6

Другие решения


По вопросам рекламы [email protected]