繁体   English   中英

从文件读取值并使用类

[英]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.cppmoney.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM