1

ユーザーが個人データベースのファイル名を入力して読み取ることができるようにするプログラムを作成しています。次にプログラムは、各状態リンク内に状態オブジェクトのリンク リストと人物オブジェクトのリンク リストを作成し、ファイルからの情報を整理します。

ファイル名を直接コーディングして、州のリストと各州の人々のリストを出力できたので、リンクされたリストの部分が機能することはわかっています。ただし、ユーザーがファイル名をコマンドとして入力できるようにしようとすると、バス エラーが発生します。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;
        }
    }
}
4

1 に答える 1