【问题标题】:reading strings and numbers from input file stream using getline使用 getline 从输入文件流中读取字符串和数字
【发布时间】:2017-03-31 09:29:27
【问题描述】:

我得到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 而不是 >> 作为名称字段。 幸运的是,国家是最后一个字段,所以我们可以使用“>>”来阅读 人口,然后一条 getline 完成这条线。 您将需要输入数据,直到到达文件末尾。回想一下,如果在文件末尾,getline 的返回值为 false,所以它的 很容易检查。

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

请指教。

【问题讨论】:

  • 您有while(!eof) 反模式的组合,并且读取越界(例如,访问year1[50] 是未定义的行为)。

标签: c++ fstream getline


【解决方案1】:

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

您还有一个超出范围的问题。条件i &lt; 51 是错误的。 i 的值 50 将在您索引它们时溢出您的数组。所以正确的条件是i &lt; 50

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

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

【讨论】:

  • 感谢您的指正。仍然在修复之后,分段错误仍然存​​在。你对此有什么想法吗?
  • 在启用调试符号的情况下编译您的程序(-g 标志)。附加一个调试器,例如gdb 并运行您的程序。让它崩溃,然后使用bt 调试器命令显示调用堆栈。这会告诉你是哪一行代码导致了问题。
  • 文件可以编译/运行没有问题没有getline的行
  • 我真正想知道的是,如何将第一和第二列读取/存储到int 变量和第三和第四(可能是第五,甚至第六)列作为string 变量,使用ifsream ifstr &gt;&gt; year1[i] &gt;&gt; year2[i]; // for int variablesgetline //for the rest of columns as a string variable
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 2018-03-21
相关资源
最近更新 更多