对于我的comp sci课程,我必须创建一个程序(简单地说)处理员工。到目前为止,我没有任何问题。但是,作业的最后一部分是“创建一个测试程序,该程序处理从文本文件输入的5名员工的数组,然后作为员工报告输出到屏幕上。” 我认为这相对容易,毕竟解析文本文档有多难。问题是我需要输入字符串和整数,它们不是任何简单的模式或分离。我必须输入数据的函数如下所示:
void employeeType::setEmployeeType(string first, string middle, string last,
int month, int day, int year, int ID,
string street, string town, string state, int zip, string county, string country,
int home, int cell, string email,
int sMonth, int sDay, int sYear,
string oStreet, string oTown, string oState, int oZip, string oCounty, string oCountry,
int work, int salary) {//code here..}
我在文本文件中输入了一条:
William, R, Smith, 8, 24, 1963, 555238911, 12345 Street1, State1, 77123, County1, Country1, 1112223333, 3332221111, email@email.com, 3, 19, 2007, 12345 oStreet1, oTown1, oState1, 77987, oCounty1, oCountry1, 2221113333, 75000
我计划通过检测每个“,”来分隔每个输入,这将结束每个输入。我总是可以硬编码,以便某些输入(输入数字4,5,6,7,10,13,14,16,17,18,22,23和24)将被解析为整数,但这不会看起来非常好,可能有更好的方法来做到这一点。有没有人有建议?
我总能提供所需的任何额外信息。
答案 0 :(得分:1)
此解决方案定义了一个与comas(,)匹配的新空格。我还定义了一个数据结构,但这是可选的。最后,它使用ifstream流来获取结构内的数据。
以下文字中的更多信息:http://en.cppreference.com/w/cpp/locale/ctype_char
#include <iostream> //to output results
#include <vector> //for the whitespace
#include <fstream> //to open the file
#include <string> //strings
using namespace std;//Avoid that in real projects
// Define a new type of white-space that mach comas (,)
struct my_whitespace : std::ctype<char>
{
static const mask* make_table()
{
// make a copy of the "C" locale table
static std::vector<mask> v(classic_table(),
classic_table() + table_size);
// these will be whitespace
v[','] |= space;
// space and tab won't be whitespace
v[' '] &= ~space;
v['\t'] &= ~space;
return &v[0];
}
my_whitespace(std::size_t refs = 0) :
std::ctype<char>(make_table(), false, refs) {}
};
// Data structure to save each line of the file (optional)
struct Data
{
string first;
string middle;
string last;
int month;
int day;
int year;
int ID;
string street;
//...
};
// Main function, in real project, get that outside the main.
int main()
{
// Open the file
ifstream file ("file.txt", ios::in);
// Set the white-space to mache comas
my_whitespace *ws = new my_whitespace();
file.imbue( std::locale(file.getloc(), ws));
if (file.is_open())
{
Data d;
// For each line of the file
while (file)
{
char s; // To skip the first space after the coma.
// Read one line of the file.
file >>
d.first >>
s >> d.middle >>
s >> d.last >>
s >> d.month >>
s >> d.day >>
s >> d.year >>
s >> d.ID >>
s >> d.street //>>
/*...*/
;
// Print the result (optional)
cout << d.first << endl;
cout << d.middle << endl;
cout << d.last << endl;
cout << d.month << endl;
cout << d.day << endl;
cout << d.street << endl;
//...
}
}
file.close(); // This function delete ws
// delete ws;
return 0;
}
注意:请注意字符串字段中的逗号。