2016-11-17 209 views
0

我得到getline(ifstream foo, string bar)函数的语法,我知道它的第三个参数是分隔符,它被设置为'\ n'。使用getline从输入文件流中读取字符串和数字

我有一个文件要读取,它有第一和第二列的数字。 问题是在第三列中,我必须读取可能包含空格的国家的名称。

我检查过我的代码是成功地从前两列中读取数字的,但是当我的代码尝试读取国家名称时,出现'Segmentation fault (cord dumped)'错误消息。

我的代码如下所示:

string name[50]; 
double year1[50],year2[50]; 
fstream ifstr; 
ifstr.open("thefile.csv"); 
for (int i=0; (!(ifstr.eof())) || i < 51; i++) { 
ifstr >> year1[i] >> year2[i]; 
getline(ifstr, name[i]);} // expecting this line to be reading/storing 
//anything that comes after 3rd column into string array 

我分配给定的变量是太漫长而复杂,让我有种写道,以帮助可读性,但是这一条线是相当多的问题。

从说明书,我的教授提到

阅读群体很简单,并且可以使用我们课堂上的 标准文件IO函数来完成(即“>>”使用 输入流)。但是,由于某些国家/地区的名称包含 空格,因此我们需要在名称字段中使用getline而不是>>。 幸运的是,这个国家是最后一个领域,所以我们可以用“>>”来读取 人群,然后用getline来完成这一行。 您需要输入数据直到文件结束。回想一下,如果文件结束,getline的返回值是false,所以它的 很容易检查。

我查了一下所有关于这个主题的资源,但是我找不到解决这个问题的人。

请指教。

+3

你的组合['而(!EOF)'](http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-错误)反模式,并且读出界限(例如,访问'year1 [50]'是未定义的行为)。 – user657267

回答

1

您的循环条件错误。你只应该循环,而这两个值都是。如果他们中的任何一个变得虚假,你应该停止。所以||实际上应该是&&

您还有一个超出范围的问题。条件i < 51是错误的。如果索引它们,i的值为50会使数组溢出。所以正确的条件是i < 50

最后,eof不是应该导致您停止阅读的流的唯一条件。只需使用流的布尔操作符。

+0

感谢您的纠正。仍然在修复后,分段错误仍然存​​在。你有什么想法吗? – Minjae

+0

用启用调试符号编译你的程序('-g'标志)。附加一个调试器,比如'gdb'并运行你的程序。让它崩溃,并使用'bt'调试器命令向您显示调用堆栈。这会告诉你哪一行代码导致了问题。 – paddy

+0

如果没有'getline'的行,文件就可以毫无问题地编译/运行 – Minjae