[英]Reading values from a file and using classes
嗨,我在从名为money.txt的输入文件中填充2个私有类成员的值时遇到麻烦。 您能告诉我为什么它只读取文件的第一个值(在第一行声明的大小之后),而不读取其余的值吗? 如果我的方法不是最好的方法,您可以推荐另一种方法来解决此问题吗?
这是money.h文件:
#ifndef money_h
#define money_h
class Money{
public:
void getdollars();
void getcents();
void printdollars();
void printcents();
private:
int dollars[3];
int cents[3];
};
#endif
这是实现.cpp
#include"money.h"
#include<fstream>
#include<iostream>
using namespace std;
ifstream instream;
void Money::getdollars()
{
instream.open("money.txt");
int s;
instream>>s;
instream>>dollars[0];
instream>>dollars[1];
instream>>dollars[2];
}
void Money:: getcents()
{
instream.open("money.txt");
int s;
instream>>s;
instream>>cents[0];
instream>>cents[1];
instream>>cents[2];
}
void Money:: printdollars()
{
cout<<*dollars;
}
void Money:: printcents()
{
cout<<*cents;
}
这是main.cpp和money.txt文件
#include"money.h"
#include<iostream>
#include<fstream>
using namespace std;
Money** readMoney(Money** &x , char* filename)
{
int size;
ifstream instream;
instream.open(filename);
instream>>size;
x = new Money*[size];
for(int i = 0;i<size;i++)
{
x[i] = new Money[size];
for(int j = 0;j<size;j++)
{
x[i][j].getdollars();
x[i][j].getcents();
}
}
return x;
}
void printmoney(Money **a,int size)
{
ifstream instream;
int i = 0 , j = 0;
while(i<size && j<size)
{
a[i][j].printdollars();
cout<<" ";
a[i][j].printcents();
cout<<endl;
j++;
}
}
void main()
{
Money** test;
ifstream instream;
readMoney(test,"money.txt");
printmoney(test,3);
}
Money.txt
3
5 60
2 30
3 21
快速浏览一下,似乎该代码打开了文件“ money.txt”三次。 第一次在功能readMoney
,在第二时间getdollars
以及在第三时间getcents
。 可能是这个问题。 在readMoney
函数中仅打开一次文件,并将打开的流传递给Money
实例。
打开文件时,默认情况下它从头开始读取。
您可以seek
其他地方,但是您的情况不需要这样做。
如果您将ifstream instream;
类的成员,并传入文件名,它可以在构造函数中打开文件并在那里反序列化。 (或者,如果需要,您get
函数)。
否则,您可以在main
打开文件,并让get
函数获取输入流。
两种方式都可以一次打开文件,并允许每次读取为您准备下一个读取点。
编辑:
举例来说,如果您将流作为更通用的内容发送到get
函数中,例如istream
则可以发送stringstream或其他流类型。
void Money::getdollars(istream &file)
{
int s;
file>>s;
file>>dollars[0];
file>>dollars[1];
file>>dollars[2];
}
//... and similarly for other functions
//...
#include "money.h"
#include <sstream>
int main()
{
Money money;
std::stringstream stream("3\n5 60\n2 30\n3 21");
money.getdollars(stream);
}
请注意通过引用istream &file
获取它,因此状态可以更改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.