我正在尝试逐行读取文件,并将该行数据存储在名为“command”的对象中(其中包含有关机器人对象可以理解的指令的信息)
这是读取函数(C ++):
int robot::readfile(const char fname[]) {
FILE *rf;
rf = fopen(fname, "r");
if (rf != NULL) {
int idx = 0;
char record[161];
while ((this->cmd_count < this->cmd_size)
&& (fgets(record, 160, rf) != NULL)) {
command tmp_cmd(record);
this->cmds[idx++] = tmp_cmd;
}
} else {
perror(fname);
}
fclose(rf);
return 1;
}
基本上,在上面的代码中,当我尝试将变量“idx”递增1(使用语法:idx ++)时,它基本上只是崩溃了应用程序。
任何想法为什么?
编辑: 正如评论者所要求的那样:
void robot::cmd_malloc(int size) {
// most likely will cause problems if size is below 1.
if (size < 1) {
return;
}
try {
this->cmds = new command[size];
this->cmd_size = size;
this->cmd_count = 0;
} catch (std::bad_alloc) {
// bad allocation exception.
this->cmds = NULL;
cout << "bad_alloc:" << (sizeof(command) * size) << " in 'robot::cmd_malloc'." << endl;
}
}
答案 0 :(得分:3)
你没有在循环中递增cmd_count
,这意味着在某些时候idx
会变得大于cmd_size
,导致程序崩溃。
编写代码的C ++样式是使用:
std::vector<command>
而不是new command[size]
。如果您使用std::vector
,那么您不必自己进行内存管理,而且您不必维护另外两个变量cmd_size
和cmd_count
,因为vector本身通过{{{{}}提供这些信息。分别为1}}和size()
成员函数。
capacity()
而不是std::ifstream
。在循环中读取输入时,您应该使用FILE*
而不是std::string
,尽管我不确定此部分,因为我不知道具体是什么您尝试从流中读取的数据。