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

Posted

技术标签:

【中文标题】从文件中读取数据并将其写入不同的文件(Visual Studio 2012)【英文标题】:Reading data from a file and Writing it to a different file (Visual studio 2012) 【发布时间】:2014-09-21 14:49:19 【问题描述】:

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

所以数据文件。从此:

   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】:

您对“Komplektai.txt”文件的阅读与其格式不同步。 您首先读取(在 Ivesti1 中)n 和 m 两个整数。好的没问题。您忽略单个字符。我不明白。您不必自己处理 '\n' 。接下来你进入一个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
    ....

【讨论】:

以上是关于从文件中读取数据并将其写入不同的文件(Visual Studio 2012)的主要内容,如果未能解决你的问题,请参考以下文章

从 zip 文件中读取文件并将其写入另一个文件时面临的问题

如何将 BIM 360 文件的内容作为文件流读取并将其写入另一个流

从 txt 文件中读取数据并将其添加到 Observable 集合中

delphi中怎么逐行读取文本文件的数据并将每行分别写入指定的不同编辑框

如何从单个文件中读取不同的模式 json 对象并将其保存到表中

java 读取当前java文件的数据并将其写入另一个文件