我有一个包含Garbage类的5个实例的程序,垃圾有3个我需要从数据文件更新的变量。第一个是char数组,另外两个是整数。除了更新int变量之外的所有工作,我都不知道如何实现这一点,所以任何帮助都非常感谢。我的代码:
#include <iostream>
#include <cctype>
#include <cstring>
#include <fstream>
#include <iomanip>
using namespace std;
class Garbage {
public:
void writeData();
void updateFromFile( ifstream & file );
private:
char name[40];
int num1;
int num2;
};
void Garbage::writeData() {
cout << name << ", " << num1 << ", " << num2 << endl;
}
void Garbage::updateFromFile ( ifstream & file ) {
if ( !file.eof() ) {
file.getline(name, STRLEN);
/*
Int variables from Garbage class need to be updated here
*/
}
}
void readFile() {
ifstream infile("data.txt");
for(int i = 0; i < sizeof(garbages)/sizeof(garbages[0]); i++) {
garbages[i].updateFromFile(infile);
}
}
Garbage garbages[5];
int main() {
readFile();
for(int i = 0; i < sizeof(garbages)/sizeof(garbages[0]; i++) {
garbages[i].writeData();
}
return 0;
}
&#34; data.txt&#34;的数据结构如下:
lorem A
10 20
ipsum B
20 30
dolor C
30 40
sit D
40 50
amet E
50 60
lorem是char数组(可能包含空格!),10是num1,20是num2,依此类推。由于这是一个学校作业,我不能改变c ++代码的结构,也不能改变数据文件结构。如果没有额外的预处理指令就可以实现这一目标,那将是更可取的。
非常感谢任何和所有输入!
编辑:修复了类成员函数命名不一致和使用sizeof()的情况。我还在数据结构的名称字段中添加了一个可选字母,表明该名称可能包含空格,因此我不能依赖&#34;&gt;&gt;&#34;运营商,必须使用getline。
答案 0 :(得分:1)
流运营商消耗空白。你所需要的只是
void Letter::updateFromFile ( ifstream & file ) {
file.getline(name, STRLEN);
file >> num1 >> num2 >> ws; // eat the end of line
}
其他:
如果您可以控制参数,我会将其更改为istream &
,因为没有任何特定于文件流的参与。努力使用正常工作的最不具体的类型。
C样式数组比std::array
和std::vector
更奇怪,更难安全使用,功能更少。今天使用它们的唯一原因是与C代码共享定义。