从文件中读取数据并将其写入不同的文件(Visual Studio 2012)

时间:2014-09-21 14:49:20

标签: c++ visual-c++ visual-studio-2012

我遇到的问题是我正在从文件中读取数据然后将它们写入文件,但第一个元素被删除了。我会告诉你一个例子。对于这种语言很抱歉,不过它不会因为理解发生了什么而中断,这段代码很简单。

所以数据文件。由此:

   4 12
    Domas P 2 balta Z 0 balta R 0 balta B 0 balta V 0 balta K 0 balta P 2 juoda Z 0 juoda R 0 juoda B 0 juoda V 0 juoda K 0 juoda
    Lukas P 4 balta Z 0 balta R 0 balta B 0 balta V 0 balta K 0 balta P 4 juoda Z 0 juoda R 0 juoda B 0 juoda V 0 juoda K 0 juoda
    Tomas P 6 balta Z 0 balta R 0 balta B 0 balta V 0 balta K 0 balta P 6 juoda Z 0 juoda R 0 juoda B 0 juoda V 0 juoda K 0 juoda
    Tadas P 8 balta Z 0 balta R 0 balta B 0 balta V 0 balta K 0 balta P 8 juoda Z 0 juoda R 0 juoda B 0 juoda V 0 juoda K 0 juoda

我得到了这个:

P      2 balta    Z      0 balta    R      0 balta    B      0 balta    V      0 balta    K      0 balta    P      2 juoda    P      4 balta    Z      0 balta    R      0 balta    B      0 balta    V      0 balta
Lukas    P      4 balta    Z      0 balta    R      0 balta    B      0 balta    V      0 balta    K      0 balta    P      4 juoda    P      6 balta    Z      0 balta    R      0 balta    B      0 balta    V      0 balta
Tomas    P      6 balta    Z      0 balta    R      0 balta    B      0 balta    V      0 balta    K      0 balta    P      6 juoda    P      8 balta    Z      0 balta    R      0 balta    B      0 balta    V      0 balta
Tadas    P      8 balta    Z      0 balta    R      0 balta    B      0 balta    V      0 balta    K      0 balta    P      8 juoda    Z      0 juoda    R      0 juoda    B      0 juoda    V      0 juoda    K      0 juoda

第一个元素“Domas”被删除了。如果它是一个int类型变量,它将显示-884646546或类似的东西。正如我已经知道的那样,这意味着程序无法找到任何东西,并且写入空白空间或随机的负面内容。但是我不知道如何解决这个问题,这就是问题所在。谢谢你的帮助!

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

using namespace std;

const char CD1fv[] = "Komplektai.txt";
const char CD2fv[] = "Parama.txt";
const char CRfv[] = "Turnyras.txt";

class Komplektas
{
private:
    int eile;
    int kiek;
    string fig;
    string spalva;
    string vardas;
public:
    Komplektas(int k = 0, string f = "", string s = "") :
    kiek(k), fig(f), spalva(s) { }
    ~Komplektas() { }
    void Deti(int k, string f, string s) { kiek = k; fig = f, spalva = s; }
    void Eile(int e) { eile = e; }
    void Vardas(string v) { vardas = v; }
    string ImtiVarda() { return vardas; }
    int ImtiEile() { return eile; }
    string ImtiFigura() { return fig; }
    int ImtiKieki() { return kiek; }
    string ImtiSpalva() {return spalva; }
};

class Matrica
{
public:
    static const int CMaxEil = 100;
    static const int CMaxSt = 7;
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 Ivesti1(const char fv[], Matrica & A);
void Ivesti2(const char fv[], Matrica & A);
void Spausdinti1(const char fv[], Matrica & A);
void Spausdinti2(const char fv[], Matrica & A);


int main()
{
    Matrica Figuros;

    Ivesti1(CD1fv, Figuros);
    Spausdinti1(CRfv, Figuros);

    Ivesti2(CD2fv, Figuros);
    Spausdinti2(CRfv, Figuros);

    cout << "Pradiniai duomenys isspausdinti faile " << CRfv << endl;
    cout << "Programa baige darba" << endl;
    return 0;
}

void Ivesti1(const char fv[], Matrica & A)
{
    int n, m;
    string spalva;
    string fig;
    int eile, kiek;
    Komplektas komplektas;
    ifstream fd(fv);
    fd >> n >> m;
    A.DetiN(n);
    A.DetiM(m);
    fd.ignore();
    for (int i = 0; i < n; i++){
        fd >> eile;
        komplektas.Eile(eile);
        for (int j = 0; j < m; j++) {
            fd >> fig >> kiek >> spalva;
            komplektas.Deti(kiek, fig, spalva);
            A.DetiReiksme(i, j, komplektas);
        }

    }

    fd.close();
}

void Spausdinti1(const char fv[], Matrica & A)
{
    Komplektas x;
    ofstream fr(fv, ios::app);
    for (int i = 0; i < A.ImtiN(); i++) {
        fr << i+1;
        for (int j = 0; j < A.ImtiM(); j++) {
            x = A.ImtiReiksme(i , j);
            fr << setw(5) << x.ImtiFigura() << " " << right
                << setw(6) << x.ImtiKieki() << " " << x.ImtiSpalva();
        }
        fr << endl;
    }
    fr << endl;
    fr.close();
}

void Ivesti2(const char fv[], Matrica & A)
{
    int n, m;
    string spalva;
    string fig;
    string vardas;
    int eile, kiek;
    Komplektas komplektas;
    ifstream fd(fv);
    fd >> n >> m;
    A.DetiN(n);
    A.DetiM(m);
    fd.ignore();
    for (int i = 0; i < n; i++){
        fd >> vardas;
        komplektas.Vardas(vardas);
        for (int j = 0; j < m; j++){
            fd >> fig >> kiek >> spalva;
            komplektas.Deti(kiek, fig, spalva);
            A.DetiReiksme(i, j, komplektas);
        }
    }
    fd.close();
}

void Spausdinti2(const char fv[], Matrica & A)
{
    Komplektas x;
    ofstream fr(fv, ios::app);
    for (int i = 0; i < A.ImtiN(); i++) {
        fr << x.ImtiVarda();
        for (int j = 0; j < A.ImtiM(); j++) {
            x = A.ImtiReiksme(i , j);
            fr << setw(5) << x.ImtiFigura() << " " << right
                << setw(6) << x.ImtiKieki() << " " << x.ImtiSpalva();
        }
        fr << endl;
    }
    fr << endl;
    fr.close();
}

1 个答案:

答案 0 :(得分:0)

您阅读文件&#34; Komplektai.txt&#34;与其格式不同步。 你首先读(在Ivesti1中)n和m两个整数。好没问题。你忽略了一个角色。我不明白。你不必处理&#39; \ n&#39;你自己。接下来,输入for循环。你在循环中做的第一件事是阅读eile,一个int。但文件位置指向&#34; Domas&#34;。因此,您的流将进入错误状态,并且您将来的所有读取都将失败。

我建议你在调试器中单步执行代码,Visual Studio有一个很好的调试器。注意读取成功时如何修改变量。

在C ++中,一般的习惯用法是尝试读取内容,然后在继续之前验证读取是否成功。

for (int j = 0; j < m; j++) {
    fd >> fig >> kiek >> spalva;
    if (!fd) {
        std::cerr << "something went wrong" << std::endl;
        break;    // Can't continue, the stream is in a bad state
    }
    // Here we know the previous reads succeeded and we can use the read data
    ....
}