使用getline从输入文件流中读取字符串和数字

时间:2016-11-17 00:23:04

标签: c++ fstream getline

我得到getline(ifstream foo, string bar)函数的语法,我知道它的第三个参数是分隔符,设置为' \ n'。

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

我已经检查过我的代码是否成功地从前两列读取数字,但是当我的代码尝试读取国家/地区名称时,我收到了'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功能(即&#34;&gt;&gt;&#34;使用   输入流)。但是,由于某些国家的名称包含   空格,我们需要使用getline而不是&gt;&gt;为名称字段。   幸运的是,这个国家是最后一个领域,所以我们可以使用&#34;&gt;&gt;&#34;阅读   人口,然后获得完成线的getline。       您需要输入数据,直到到达文件末尾。回想一下,如果在文件末尾,getline的返回值为false,那么它就是   很容易检查。

我查找了有关此主题的所有可用资源,但到目前为止我找不到解决此问题的资源。

请告知。

1 个答案:

答案 0 :(得分:1)

您的循环条件错误。您应该只在这些值的两个都为真时循环。如果其中任何一个变为假,你应该停止。因此||实际应该是&&

你也有一个超出范围的问题。条件i < 51是错误的。当您对数组进行索引时,i的值为50会溢出。所以正确的条件是i < 50

最后,eof不是流上唯一会导致您停止阅读的条件。只需使用流的bool运算符。

for( int i = 0; ifstr && i < 50; i++ )