使用 getline - C++ 将文本文件读入 class 成员变量
Read text file into class member variables using getline - c++
我最近开始学习c++,所以我还在学习中。基本上我试图在找到字符串 "NEW_EMPLOYEE" 时读取我的文本文件,然后将每一行存储到它们各自的成员变量中,直到在文本文件中找到一个空行停止。我遇到的问题是如何使用 getline 一次将每一行导入我的 class "Employee" 的每个变量?我应该改用 istringstream 吗?
我的文本文件名为 "employee.txt"
NEW_EMPLOYEE
460713
John
Smith
64000
36
END_OF_FILE
我的class员工:
class Employee {
private: //Member variables
int ID;
string FirstName;
string LastName;
int Salary;
int Hours;
public:
Employee() {} //Default constructor
Employee(int& id, string& firstName, string& lastName, int& salary, int& hours) {
ID = id;
FirstName = firstName;
LastName = lastName;
Salary = salary
Hours = hours;
}
};
我的main.cpp:
#include <iostream>
#include <fstream>
int main() {
Employee employee;
int id;
string firstName;
string lastName;
int salary;
int hours;
string line;
ifstream employeeFile;
employeeFile.open("employee.txt");
while(getline(employeeFile, line)) {
if(line == "NEW_EMPLOYEE") {
do {
//Don't know what to do here???
} while (!line.empty());
}
}
employeeFile.close();
return 0;
}
直接的方法是做类似的事情
while(employeeFile >> line){
if(line != "NEW_EMPLOYEE") continue;
int id,salary,hours;
string firstName, lastName;
employeeFile >> id >> firstName >> lastName >> salary >> hours;
Employee employee = Employee(id, firstName, lastName, salary, hours);
// Do what you want with employee
}
这假设数据总是以相同的顺序写入文件。我还假设这些行不包含空格,因为它们是数字或名称,所以我使用了 >>
运算符。如果不是这样,您可以使用 getline
。
如果您始终确定数据的顺序相同,那么这就足够了。如果不是这样,我建议在文件中将对象写为 JSON,并使用 JSON 解析器库将文件直接读入对象。
是的..直接的方法可以帮助你,否则你可以使用简单的方法,比如...
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <sstream>
using namespace std;
int main() {
string x[100];
int i=0;
// Employee employee;
int id;
string firstName;
string lastName;
int salary;
int hours;
string line;
string text;
ifstream employeeFile;
employeeFile.open("employee.txt");
while(!employeeFile.eof())
{
getline(employeeFile,text);
x[i++]=text;
}
// employeeFile.close();
stringstream(x[1]) >> id; //string to int
firstName = x[2];
lastName = x[3];
stringstream(x[4]) >> salary;
stringstream(x[5]) >> hours;
//cout<<id<<" "<<firstName;
}
然后你就可以调用你的方法了。但是直接的方法比这更完美:)
我最近开始学习c++,所以我还在学习中。基本上我试图在找到字符串 "NEW_EMPLOYEE" 时读取我的文本文件,然后将每一行存储到它们各自的成员变量中,直到在文本文件中找到一个空行停止。我遇到的问题是如何使用 getline 一次将每一行导入我的 class "Employee" 的每个变量?我应该改用 istringstream 吗?
我的文本文件名为 "employee.txt"
NEW_EMPLOYEE
460713
John
Smith
64000
36
END_OF_FILE
我的class员工:
class Employee {
private: //Member variables
int ID;
string FirstName;
string LastName;
int Salary;
int Hours;
public:
Employee() {} //Default constructor
Employee(int& id, string& firstName, string& lastName, int& salary, int& hours) {
ID = id;
FirstName = firstName;
LastName = lastName;
Salary = salary
Hours = hours;
}
};
我的main.cpp:
#include <iostream>
#include <fstream>
int main() {
Employee employee;
int id;
string firstName;
string lastName;
int salary;
int hours;
string line;
ifstream employeeFile;
employeeFile.open("employee.txt");
while(getline(employeeFile, line)) {
if(line == "NEW_EMPLOYEE") {
do {
//Don't know what to do here???
} while (!line.empty());
}
}
employeeFile.close();
return 0;
}
直接的方法是做类似的事情
while(employeeFile >> line){
if(line != "NEW_EMPLOYEE") continue;
int id,salary,hours;
string firstName, lastName;
employeeFile >> id >> firstName >> lastName >> salary >> hours;
Employee employee = Employee(id, firstName, lastName, salary, hours);
// Do what you want with employee
}
这假设数据总是以相同的顺序写入文件。我还假设这些行不包含空格,因为它们是数字或名称,所以我使用了 >>
运算符。如果不是这样,您可以使用 getline
。
如果您始终确定数据的顺序相同,那么这就足够了。如果不是这样,我建议在文件中将对象写为 JSON,并使用 JSON 解析器库将文件直接读入对象。
是的..直接的方法可以帮助你,否则你可以使用简单的方法,比如...
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <sstream>
using namespace std;
int main() {
string x[100];
int i=0;
// Employee employee;
int id;
string firstName;
string lastName;
int salary;
int hours;
string line;
string text;
ifstream employeeFile;
employeeFile.open("employee.txt");
while(!employeeFile.eof())
{
getline(employeeFile,text);
x[i++]=text;
}
// employeeFile.close();
stringstream(x[1]) >> id; //string to int
firstName = x[2];
lastName = x[3];
stringstream(x[4]) >> salary;
stringstream(x[5]) >> hours;
//cout<<id<<" "<<firstName;
}
然后你就可以调用你的方法了。但是直接的方法比这更完美:)