复杂的文件读取(Visual Studio 2012)

时间:2014-09-20 22:30:42

标签: c++ visual-c++ file-io

我坚持从文件中读取数据。所以这里。我有5个国际象棋比赛,但我有一些数字丢失,(第一档),但是,有些人给我带来了一些他们自己的数据(第二档),我需要计算我到底有多少完整的国际象棋桌。长话短说。这是第一个文件的示例。我只需要弄清楚如何正确阅读它。在阅读循环中,很明显我将只获得最后一行,但这是我最好的镜头。我不知道如何获取类内存中的所有数据。我是新手,感谢您的帮助:

//5-number of incomplete chess games. P/Z/R/B/V/K-names of figures. 8/2/2/2/1/1-number of figures
//balta/juoda-white/black; if there is any other way to write this file in a different way and im too stupid to figure it out i would be thankful for the info

5 
1 P 8 balta Z 2 balta R 2 balta B 2 balta V 1 balta K 1 balta P 8 juoda Z 2 juoda R 2 juoda B 2 juoda V 1 juoda K 1 juoda
2 P 6 balta Z 2 balta R 2 balta B 2 balta V 1 balta K 1 balta P 6 juoda Z 2 juoda R 2 juoda B 2 juoda V 1 juoda K 1 juoda
3 P 4 balta Z 2 balta R 2 balta B 2 balta V 1 balta K 1 balta P 4 juoda Z 2 juoda R 2 juoda B 2 juoda V 1 juoda K 1 juoda
4 P 2 balta Z 2 balta R 2 balta B 2 balta V 1 balta K 1 balta P 2 juoda Z 2 juoda R 2 juoda B 2 juoda V 1 juoda K 1 juoda
5 P 0 balta Z 2 balta R 2 balta B 2 balta V 1 balta K 1 balta P 0 juoda Z 2 juoda R 2 juoda B 2 juoda V 1 juoda K 1 juoda



#include <iostream>
#include <string>
#include <iomanip>
#include <fstream>
#include <istream>

using namespace std;

    const int Cn = 100;

const char CFd1[] = "Komplektai.txt";
const char CFd2[] = "Parama.txt";
const char CFr[] = "Turnyras.txt";

class Komplektas
{
private:
    int eil;
    char fig;
    int kiek;
    string spal;
public:
    void Deti(int e, char f, int k, string s);
    int ImtiEile()  { return eil; }
    char ImtiFigura() { return fig; }
    int ImtiKieki() { return kiek; }
    string ImtiSpalva() { return spal; }
};

void Komplektas::Deti(int e, char f, int k, string s)
{
    eil = e;
    fig = f;
    kiek = k;
    spal = s;
}

void Skaityti1(string fv, Komplektas A[], int & x1, int & j);

void Spausdinti1(string fv, Komplektas A[], int x1, int j);

int main()
{
    int x1;
    int j;
    Komplektas A[Cn];
    Skaityti(CFd1, A, x1, j1);
    Spausdinti(CFr, A, x1, j1);


    cout << "Programa baige darba" << endl;
    return 0;
}

void Skaityti(string fv, Komplektas A[], int & x, int & j)
{
    int eil, kiek;
    char fig;
    string spal;
    ifstream fd(fv.c_str());
    fd >> x;
    fd >> j;
    for (int t = 0; t < x; t++)
        fd >> eil;
        for (int i = 0; i < j; i++){
            fd >> fig >> kiek >> spal;
            A[i].Deti(eil, fig, kiek, spal);
            fd.ignore();
        }
        fd.close();
}
void Spausdinti(string fv, Komplektas A[], int x, int j)
{
    ofstream fr(fv.c_str());
    fr << x << endl;
    fr << j << endl;
    for (int t = 0; t < x; t++){
        for (int i = 0; i < j; i++){
            fr << A[i].ImtiEile() << " " << A[i].ImtiFigura() << " " << A[i].ImtiKieki() << " " << A[i].ImtiSpalva() << endl;
        }
    }
        fr.close();
}

2 个答案:

答案 0 :(得分:0)

我很困惑,因为我不会说立陶宛语,但是,据我所知,您的读取方法(Skaityti)读取所有内容并将其存储在一维数组中。您正在循环所有行,并且您正在存储eil中的所有值。但是,在读取第一行并转到第二行后,您将覆盖第一行的值,依此类推。当你到达最后一行时,你正在读它并覆盖倒数第二行。我相信解决方案是拥有一个二维数组,第一个维度代表行,第二个维度代表给定行的值。这样你就可以拥有每一行的值。

因此A是一个Komplektas数组的数组,如

Komplektas A[r][v],其中r表示行数,v表示值的数量,那么您可以存储t行的i值为A[t][i]

答案 1 :(得分:0)

感谢您的帮助和对不起代码中的语言。仍然惊讶你知道它是什么语言。我尝试用二维数组(矩阵)做一些事情,但我完全是绿色的。继承人我的尝试。这就是我得到的:

1 P 0 balta 1 Z 0 balta 1 R 0 balta 1 B 0 balta 1 V 0 balta 1 K 0 balta 1 P 0 juoda 1 Z 0 juoda 1 R 0 juoda 1 B 0 juoda 1 V 0 juoda 1 K 0 juoda 1 2 0 juoda 
1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 
1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 
1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 
1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 1 2 0 juoda 

而不是:

5 13
1 P 8 balta Z 2 balta R 2 balta B 2 balta V 1 balta K 1 balta P 8 juoda Z 2 juoda R 2 juoda B 2 juoda V 1 juoda K 1 juoda
2 P 6 balta Z 2 balta R 2 balta B 2 balta V 1 balta K 1 balta P 6 juoda Z 2 juoda R 2 juoda B 2 juoda V 1 juoda K 1 juoda
3 P 4 balta Z 2 balta R 2 balta B 2 balta V 1 balta K 1 balta P 4 juoda Z 2 juoda R 2 juoda B 2 juoda V 1 juoda K 1 juoda
4 P 2 balta Z 2 balta R 2 balta B 2 balta V 1 balta K 1 balta P 2 juoda Z 2 juoda R 2 juoda B 2 juoda V 1 juoda K 1 juoda
5 P 0 balta Z 2 balta R 2 balta B 2 balta V 1 balta K 1 balta P 0 juoda Z 2 juoda R 2 juoda B 2 juoda V 1 juoda K 1 juoda



class Komplektas
{
private:
    int eil;
    char fig;
    int kiek;
    string spal;
public:
    Komplektas(int e = 0, char f = 0, int k = 0, string s = "") :
        eil(e), fig(f), kiek(k), spal(s) { }
    ~Komplektas() { }
    void Deti(int e, char f, int k, string s) { eil = e; fig = f, spal = s; }
    int ImtiEile()  { return eil; }
    char ImtiFigura() { return fig; }
    int ImtiKieki() { return kiek; }
    string ImtiSpalva() { return spal; }
};


class Matrica
{
public:
    static const int CMaxEil = 100;
    static const int CMaxSt = 15;
private:
    Komplektas A[CMaxEil][CMaxSt];
    int n;
    int m;
public:
    Matrica(int nn = 0, int mm = 0) : n(nn), m(mm) { }
    ~Matrica()                                     { }
    int ImtiN() { return n; }
    int ImtiM() { return m; }
    void DetiN(int nn) {n = nn;}
    void DetiM(int mm) {m = mm;}
    void DetiReiksme(int i, int j, Komplektas r) { A[i][j] = r; }
    Komplektas ImtiReiksme (int i, int j) { return A[i][j]; }
};

void Skaityti1(string fv, Matrica & A);
void Spausdinti1(string fv, Matrica & A);

int main()
{
    Matrica figuros;
    Skaityti1(CFd1, figuros);
    Spausdinti1(CFr, figuros);

    cout << "Programa baige darba" << endl;
    return 0;
}

void Skaityti1(string fv, Matrica & A)
{
    int n, m, eil, kiek;
    char fig;
    string spal;
    Komplektas x;
    ifstream fd(fv);
    fd >> n >> m;
    A.DetiN(n);
    A.DetiM(m);
    for (int i = 0; i < n; i++){
        fd >> eil;
        for (int j = 0; j < m; j++){
            fd >> fig >> kiek >> spal;
            x.Deti(eil, fig, kiek, spal);
            A.DetiReiksme(i, j, x);
            cout << x.ImtiEile() << " " << x.ImtiFigura() << " " << x.ImtiKieki() << " " << x.ImtiSpalva() << endl;
        }
        }
        fd.close();
    }

void Spausdinti1(string fv, Matrica & A)
{
    Komplektas x;
    ofstream fr(fv);
    cout << A.ImtiN() << " " << A.ImtiM() << endl;
    for (int i = 0; i < A.ImtiN(); i++) {
        for (int j = 0; j < A.ImtiM(); j++) {
            x = A.ImtiReiksme(i, j);
            fr << x.ImtiEile() << " " << x.ImtiFigura() << " " <<
x.ImtiKieki() << " " << x.ImtiSpalva() << " ";
        }
    fr << endl;
    }
    fr.close();
}