使用Getline和Ifstream丢失数据行

时间:2012-11-04 07:01:13

标签: c++ ifstream

好的,所以这就是杀了我,因为我的程序这么简单的一部分,只是不想工作。我正在从文本文件中读取数据以在GA中使用。

第一个getline()工作正常,但第二个不想将任何数据写入我的字符串。当我输入字符串时它没有显示任何内容。

以下是代码:

ifstream inFile;
inFile.open(fname.c_str());
char pop[20], mut[20];

inFile.getline(pop,20);
cout << pop;
inFile.getline(mut,20);
cout << mut; //this outputs nothing

提前感谢您的帮助。 我的文件中的示例: 他们之间没有界线突变是人口之后的直线

人口规模:30
突变:20

4 个答案:

答案 0 :(得分:3)

您的文件的第一行长度为20个字符(19 +新行),但pop[20]只能包含19个(因为最后一行是为空终止符'\ 0'保留的。)

istream::getline因为提取了20-1个字符而停止时,它不会丢弃新的行分隔符(因为它从未被读取)。因此,下一个getline只会读取第一个行的结尾,丢弃新行。

这就是你在第二个字符串中什么也得不到的原因。

答案 1 :(得分:2)

您的问题是输入行的长度超过了必须保留它的缓冲区的长度。

解决方案是不使用字符数组。这是C ++,使用std::string

std::ifstream inFile;
inFile.open(fname.c_str());

std::string pop;
std::getline(inFile, pop);
cout << pop << "\n";

std::string mut;
std::getline(inFile, mut);
cout << mut << "\n";

答案 2 :(得分:1)

我认为你需要找出问题所在。将错误检查代码添加到getline调用中,将(简单)代码重构为(简单)函数,并使用(简单)单元测试。可能,你的第二行比假定的20个字符长(包含空名!)。

要了解我的意思,请查看this snippet

答案 3 :(得分:0)

尝试类似

的内容
while (getline(in,line,'\n')){
    //do something with line
}

或尝试类似

的内容
string text;
string temp; 
ifstream file;
  file.open ("test_text.txt");

  while (!file.eof())
  {
    getline (file, temp);
    text.append (temp); // Added this line
  }