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

reading strings and numbers from input file stream using getline

本文关键字:读取 字符串 数字 getline 输入 文件 使用      更新时间:2023-10-16

我得到了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函数,我们在课程中介绍过(例如,使用输入流)。然而,由于一些国家的名称包含在空格中,我们需要使用getline而不是>>作为name字段。幸运的是,国家是最后一个字段,所以我们可以使用">>"来读取然后用一条直线来完成这条直线。您将需要输入数据,直到到达文件的末尾。回想一下,如果在文件末尾,getline的返回值为false这很容易检查

我查阅了所有关于这个话题的资料,但是到目前为止我还没有找到一个解决这个问题的。

请建议。

您的循环条件错误。只有当两个值都为真时才应该循环。如果其中任何一个变成假的,你应该停止。所以||实际上应该是&&

你也有一个超出范围的问题。条件i < 51是错误的。如果i的值为50,则会在索引数组时使其溢出。所以正确的条件是i < 50

最后,eof不是流中应该导致停止读取的唯一条件。只使用流的bool操作符。

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