【问题标题】:Bus error (core dumped) with Linked Lists?链接列表的总线错误(核心转储)?
【发布时间】:2015-06-23 11:34:55
【问题描述】:

我正在编写一个程序,允许用户输入要读取的人员数据库的文件名;然后,程序会在每个状态链接中创建状态对象的链接列表和人员对象的链接列表,以组织文件中的信息。

我知道链表部分有效,因为我能够直接在文件名中编码并打印出州列表和每个州的人员列表;但是,当我尝试允许用户输入文件名作为命令时,我收到了总线错误。当我在 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;
        }
    }
}

【问题讨论】:

  • 不要使用file.eof()。这甚至可能是您的问题。
  • file.fail() 可能会更好吗?还是完全不同的东西?
  • fail 可能会更好,我不确定当您一次读取多个变量时最好的做法是什么。您也许可以将您阅读的整行放入 while 条件中。
  • @sar - 这是int main(),而不是void main()

标签: c++ pointers linked-list coredump bus-error


【解决方案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* 的构造函数。不过,在read() 函数中将参数更改为const char *filename

【讨论】:

  • 我尝试使用字符串,但由于某种原因,只有在文件名变量是 char* 时才能打开文件。如果文件名是字符串而不是 char*,我应该能够写 ifstream 文件(文件名)吗?
  • 不,仅使用 char* 就无法工作。指针未初始化,因此行为是undefined。未定义意味着任何事情都可能发生。查看我的编辑。
  • 太棒了!我终于明白了,设置了 char 数组的大小。如果你不介意我问,你究竟如何使用字符串?我想 - 如果可能的话 - 解决自己设置 char 数组大小的需要,因为谁知道文件名可能有多长。我已经在我的标题中包含了字符串(以及 cstring 和 cctype,以防万一)。
  • 如我的编辑所示,使用getline(cin, filnm)cin &gt;&gt; filnm。如果您希望获得包含空格的文件名,请使用前者(因此getline 可能是更好的选择)。
  • 非常感谢!在过去的 15 分钟里,我学到的东西比我在过去三天编写这段代码时学到的更多。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多