我遇到的问题是我正在从文件中读取数据然后将它们写入文件,但第一个元素被删除了。我会告诉你一个例子。对于这种语言很抱歉,不过它不会因为理解发生了什么而中断,这段代码很简单。
所以数据文件。由此:
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();
}
答案 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
....
}