在c++中使用getline从文件中读取数据

Using getline to read data from a file in C++

本文关键字:文件 读取 数据 c++ getline      更新时间:2023-10-16

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

文件的内容为:

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;
    }

您不应该这样混合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来传递age。

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