使用getline从C ++中读取文件中的数据

时间:2014-06-03 09:11:08

标签: c++ file input

我想从文件中读取两件事,全名(名字和姓氏) 和年龄。之后我想将它们存储在一个数组中然后打印数据。 但是,当我尝试读取第一条记录时,读取查找,但其他两条都没有。 请告诉我我错过了什么。 谢谢。

该文件的内容是:

sampleFirst1 sampleLast1
30
sampleFirst2 sampleLast2
25
sampleFirst3 sampleLast3
40

输出是:

Name:  sampleFirst1 Age: 30
Name:  Age: 30
Name:  Age: 30

这是我的代码:

#include "Person.h"
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    ifstream inputFile("data.txt", ios::in);
    string full_name;
    int age = 0;

    int i = 0;
    Person personArray[3];
    while (i < 3)
    {
        getline(inputFile, full_name);
        personArray[i].set_name(full_name);
        inputFile >> age;
        personArray[i].set_age(age);
        ++i;
    }
    inputFile.close();
    printData(personArray, 3);
    cout << endl;
    return 0;
    }

1 个答案:

答案 0 :(得分:1)

您不应该以这种方式混合getline>>运算符。喜欢这样一个更简单的代码:

#include <iostream>
#include <fstream>
#include <array>
#include <string>
using namespace std;

struct Person {
  std::string name;
  int age;

  void set_name(std::string const& i_name) { name = i_name; }
  void set_age(int i_age) { age = i_age; }
};                                                                                                                                                                                        

int main()
{
  ifstream inputFile("data.txt", ios::in);
  std::string first;
  std::string last;
  int age = 0;

  int i = 0;
  std::array<Person,3> personArray;
  while (i < personArray.size())                                                                                                                                                                                                                  {
    inputFile >> first >> last >> age;
    personArray[i].set_name(first + " " + last);
    personArray[i].set_age(age);
    ++i;
  }
  inputFile.close();

  for(Person const& person : personArray) {
    std::cout << "Name: " << person.name << " Age: " << person.age << "\n";
  }
  std::cout << std::flush;

  return 0;
}

如果您不想为全名支付字符串连接额外费用,请仅使用getlineistringstream来限制年龄。

可以说很多解析方法,但这不是重点。