我有一个文本文件,其中包含以下行:
James Dean 10 Automotive 27010.43
我需要阅读该文件并将上述4个中的每一个放入数组中。
char nameArray[MAX][NAME_MAX];
int yearArray[MAX];
char departmentArray[MAX][DEP_MAX];
double payArray[MAX];
while(i < MAX && infile) {
infile.getline(nameArray[i], 20);
infile >> yearArray[i];
infile.getline(departmentArray[i], 15);
infile >> payArray[i];
cout << nameArray[i] << " " << yearArray[i] << " " << departmentArray[i] << " " << fixed << setprecision(2) << payArray[i] << endl;
i++;
}
代码被删减只是为了让你知道我想要做什么,但是当我运行它时,我会得到类似的东西:
James Dean -858993460 -92559631349317830000000000000000000000000000
000000000000000000.00
感谢您的帮助。
====编辑==========================================
我从getline改为get,谢谢。我必须使用get而不是&gt;&gt;因为我正在阅读的一些专栏不仅仅是“詹姆斯·迪恩”,他们长达20个字符...前:“威廉·伍德沃德”是另一个。
所以,如果我只是使用get,那么它会很好地读取第一行,但后来我得到了第二行相同的混乱文本。
以下是代码:
infile.get(nameArray[i], 20);
infile >> yearArray[i];
infile.get(departmentArray[i], 15);
infile >> payArray[i];
答案 0 :(得分:2)
getline
函数接受输入流和要写入的字符串。因此,两个getline
调用读取两行。您的输入机制已损坏。或者,使用getline
或流提取运算符(即>>
),但不能同时使用两者。
如果您打算使用getline
,则需要将字符串(实际上是一行输入)解析为tokes,然后将它们存储在适当类型的数组中。第二个和第四个标记是数字,因此您需要将这些标记从字符串转换为int
或double
。
operator >>
方法:
string name, surname;
int year;
double pay;
while (infile) {
infile >> name >> surname >> year >> department >> pay;
namearray[ i ] = name + " " + surname;
// ...
payarray[ i ] = pay;
++i;
}
getline
方法:
string line;
while (getline(infile, line)) {
parse(line, tokens);
namearray[ i ] = token[ 0 ] + " " + token[ 1 ];
// ...
payarray[ i ] = strTodouble(token[ 4 ]);
++i;
}
// parse definition
void parse(string line, vector<string>& token) {
// roll your own
}
double strToDouble(string s) {
// ...
}
答案 1 :(得分:0)
我没有看到你在哪里定义infile,但我会认为它是一个ifile。在这种情况下,您应该使用它与使用cin获取输入的方式相同。
你为什么要做一个getline()? 该函数将仅在'\ n'字符或EOF字符处停止。所以这意味着,你会在行结束后开始读取一些随机数据。
如果我错了,请纠正我,但是在第一个字符串(James Dean)中,在数字(10)之前是否有20或19个字符?