您好我从一个名为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
这里是 implementation.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
答案 0 :(得分:3)
从快速查看,似乎代码打开文件&#34; money.txt&#34;三次。第一次在函数readMoney
中,第二次在getdollars
中,第三次在getcents
中。可能这个问题。仅在readMoney
函数中打开文件一次,并将打开的流传递给Money
的实例。
答案 1 :(得分:1)
当您打开文件时,默认情况下它会从头开始读取。
您可以seek
到其他地方,但在您的情况下不需要这样做。
如果使ifstream instream;
成为类的成员并传入文件名,它可以在构造函数中打开文件并在那里反序列化。 (如果必须的话,或者在get
函数中)。
否则,您可以在main
中打开文件,让get
函数接收输入流。
无论哪种方式打开文件一次,并允许每次读取为您准备好下一个读取点。
编辑:
举个例子,如果您将流发送到get
函数中作为更通用的内容,例如istream
,则允许您发送字符串流或其他流类型。
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
,以便状态可以改变。