从文件中读取值并使用类

时间:2014-11-25 14:50:24

标签: c++ arrays class pointers fstream

您好我从一个名为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

2 个答案:

答案 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,以便状态可以改变。