从文件中读取数据并将其写入其他文件(Visual studio 2012)

Reading data from a file and Writing it to a different file (Visual studio 2012)

本文关键字:文件 其他 Visual 2012 studio 读取 数据      更新时间:2023-10-16

我遇到的问题是,我从文件中读取数据,然后将它们写入文件,但第一个元素就被剪切掉了。我给你举个例子。很抱歉使用了这种语言,但它不应该打断对正在发生的事情的理解,这段代码有点简单。

数据文件也是如此。由此:

   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

第一个元素"多玛斯"就被删掉了。如果它是一个int类型的变量,它将显示-88464654646或类似的内容。正如我已经知道的,这意味着程序找不到任何东西,写东西,清空空间或那些随机的负面内容。然而,我不知道如何解决这个问题。谢谢你的帮助!

#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();
}

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

我建议您在调试器中逐步完成代码,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
    ....
}