Salve a tutti
ho 2 problemi quando vado a scrivere un file.
1) i dati mi vengono ripetuti
2) mi vengono inseriti caratteri non corretti all'inizio di ogni record escluso il primo.
#include <iostream>
using namespace std;
#include <fstream>
struct pdata
{
short aa;
short mm;
short gg;
};
struct pmedia
{
char numero[2];
char sep;
char giorno[2];
char sepbis;
char mese[2];
char septer;
char anno[4];
char sep1;
char minimo[2];
char sep2;
char tenmin[2];
char sep3;
char massimo[4];
char sep4;
char tenmax[2];
char sep5;
char media[2];
char sep6;
};
struct pprevisioni
{
char numero[2];
char sep;
char giorno[2];
char sepbis;
char mese[2];
char septer;
char anno[4];
char sep1;
char entro;
char sep2;
};
extern "C" int __stdcall ChartoInt(char* bambola);
extern "C" int __stdcall ChartoInt2(char* mambola);
extern "C" int __stdcall IntoChar(int& numero, char* bolly);
extern "C" int __stdcall IntoChar2(int& numero, char* bolly);
extern "C" bool __stdcall Bisestile(short anno);
extern "C" int __stdcall PdatatoInt(struct pdata& jolly);
extern "C" void __stdcall Calcola_Data(struct pdata& partenza, short quanti, struct pdata& arrivo);
extern "C" int __stdcall Calcola_Colonna(char* scala40, char* scopa)
{
pdata intorno_inizio, intorno_fine, esatta,ultima,biglie;
char asso[2], k[4],carattere,buffet[35];
short h, j,q,cuori,quadri,fiori,dentro;
int indy, kindy, windy, cindy,tindy,bindy,sindy,ks,kp;
indy = 0; kindy = 0; windy = 0; cindy = 0; dentro = 0; ks = 0; kp = 0;
for (indy=0;indy<35;indy++) { buffet[indy] = ' '; }
int calendario[12];
pprevisioni visioni;
visioni.sep2 = '\n'; visioni.sep = ':'; visioni.sep1 = ':';
visioni.sepbis = '-'; visioni.septer = '-';
char salva[16];
for (indy = 0; indy < 16; indy++) { salva[indy] = ' '; }
pmedia elabora;
elabora.numero[0] = '0'; elabora.numero[1] = '0';
elabora.sep = ':'; elabora.sepbis = '-'; elabora.septer = '-';
elabora.anno[0] = '0'; elabora.anno[1] = '0';
elabora.anno[2] = '0'; elabora.anno[3] = '0';
elabora.mese[0] = '0'; elabora.mese[1] = '0';
elabora.giorno[0] = '0'; elabora.giorno[1] = '0';
elabora.sep1 = ':';
elabora.minimo[0]='0'; elabora.minimo[1] = '0';
elabora.sep2 = ':';
elabora.tenmin[0]='0'; elabora.tenmin[1] = '0';
elabora.sep3 = ':';
elabora.massimo[0] = '0'; elabora.massimo[1] = '0'; elabora.massimo[2] = '0';
elabora.sep4 = ':';
elabora.tenmax[0]='0'; elabora.tenmax[1] = '0';
elabora.sep5=':';
elabora.media[0]='0'; elabora.media[1] = '0';
bool risultato;
carattere = ' ';
calendario[0] = 31; calendario[1] = 28; calendario[2] = 31;
calendario[3] = 30; calendario[4] = 31; calendario[5] = 30;
calendario[6] = 31; calendario[7] = 31; calendario[8] = 30;
calendario[9] = 31; calendario[10] = 30; calendario[11] = 31;
asso[0] = scala40[0]; asso[1] = scala40[1];
h = ChartoInt(asso); esatta.gg = h;
asso[0] = scala40[3]; asso[1] = scala40[4];
k[0] = scala40[6]; k[1] = scala40[7]; k[2] = scala40[8]; k[3]= scala40[9];
h = ChartoInt(asso); esatta.mm = h;
j = ChartoInt2(k); esatta.aa = j;
risultato = Bisestile(esatta.mm); if (risultato==true) { calendario[1] = 29; }
//-------------------------------
//* calcola il periodo intorno. *
//-------------------------------
intorno_inizio.gg = esatta.gg;
intorno_inizio.mm = esatta.mm;
intorno_inizio.aa = esatta.aa;
intorno_fine.gg = esatta.gg;
intorno_fine.mm = esatta.mm;
intorno_fine.aa = esatta.aa;
intorno_inizio.gg = intorno_inizio.gg - 3;
if (intorno_inizio.gg < 0)
{
intorno_inizio.mm--;
if (intorno_inizio.mm == 0)
{ intorno_inizio.mm = 12; intorno_inizio.aa--; intorno_inizio.gg = 28; }
else
{
intorno_inizio.gg = calendario[intorno_inizio.mm - 1] - 3;
}
}
intorno_fine.gg = intorno_fine.gg + 3;
if (intorno_fine.gg > calendario[intorno_inizio.mm - 1])
{
intorno_fine.mm++;
if (intorno_fine.mm == 13)
{
intorno_fine.mm = 1; intorno_fine.aa++; intorno_fine.gg = intorno_fine.gg -31;
}
else
{
intorno_fine.gg = 3;
}
}
tindy = PdatatoInt(intorno_inizio);
sindy = PdatatoInt(intorno_fine);
ifstream input("medie.txt", ios::in);
if (!input) { return 44; }
input.get(carattere);
std::ofstream porky("previsioni.txt", std::ofstream::out);
indy = 0;
while (!input.eof())
{
switch (carattere)
{
case '\n':
{
//----------------------------------
//* costruzione del record pmedia. *
//----------------------------------
elabora.numero[0] = buffet[0]; elabora.numero[1] = buffet[1];
elabora.anno[0] = buffet[9]; elabora.anno[1] = buffet[10];
elabora.anno[2] = buffet[11]; elabora.anno[3] = buffet[12];
elabora.mese[0] = buffet[6]; elabora.mese[1] = buffet[7];
elabora.giorno[0] = buffet[3]; elabora.giorno[1] = buffet[4];
elabora.minimo[0] = buffet[14]; elabora.minimo[1] = buffet[15];
elabora.tenmin[0] = buffet[17]; elabora.tenmin[1] = buffet[18];
windy = 0;
for (indy=20;indy<24;indy++)
{ elabora.massimo[windy] = buffet[indy]; windy++; }
elabora.tenmax[0] = buffet[25]; elabora.tenmax[1] = buffet[26];
elabora.media[0] = buffet[28]; elabora.media[1] = buffet[29];
//--------------------------------
//* calcolo giorni d'aggiungere. *
//* h = tendenza al minimo. *
//* j = tendenza al massimo. *
//* quadri = minimo. *
//* fiori = massimo. *
//* cuori = media. *
//--------------------------------
asso[0] = elabora.giorno[0]; asso[1] = elabora.giorno[1];
h = ChartoInt(asso); ultima.gg = h;
asso[0] = elabora.mese[0]; asso[1] = elabora.mese[1];
h = ChartoInt(asso); ultima.mm = h;
k[0] = elabora.anno[0]; k[1] = elabora.anno[1]; k[2] = elabora.anno[2]; k[3] = elabora.anno[3];
j = ChartoInt2(k); ultima.aa = j;
asso[0] = elabora.media[0]; asso[1] = elabora.media[1];
cuori = ChartoInt(asso);
asso[0] = elabora.minimo[0]; asso[1] = elabora.minimo[1];
quadri = ChartoInt(asso);
k[0] = elabora.massimo[0]; k[1] = elabora.massimo[1]; k[2]= elabora.massimo[2];k[3]= elabora.massimo[3];
fiori = ChartoInt2(k);
asso[0] = elabora.tenmin[0]; asso[1] = elabora.tenmin[1];
h = ChartoInt(asso);
asso[0] = elabora.tenmax[0]; asso[1] = elabora.tenmax[1];
j = ChartoInt(asso);
if (h > j) { q = (cuori * h) / 100; cuori = cuori - q; }
if (h < j) { q = (cuori * j) / 100; cuori = cuori + q; }
if (h == j) { q = cuori; }
Calcola_Data(ultima, cuori, biglie);
kp = biglie.gg;
ks = IntoChar(kp, asso);
if (ks != 0) { return ks; }
visioni.giorno[0] = asso[0]; visioni.giorno[1] = asso[1];
kp = biglie.mm;
ks = IntoChar(kp, asso);
if (ks != 0) { return ks; }
visioni.mese[0] = asso[0]; visioni.mese[1] = asso[1];
kp = biglie.aa;
ks = IntoChar2(kp, k);
if (ks != 0) { return ks; }
visioni.anno[0] = k[0]; visioni.anno[1] = k[1]; visioni.anno[2] = k[2]; visioni.anno[3] = k[3];
bindy = PdatatoInt(biglie);
if (bindy >= tindy && bindy <= sindy) { visioni.entro = 'X'; dentro++; }
else { visioni.entro = 'O'; }
if (bindy < tindy && visioni.entro != 'X') { visioni.entro = '$'; }
visioni.numero[0] = elabora.numero[0]; visioni.numero[1] = elabora.numero[1];
salva[0] = visioni.numero[0]; salva[1] = visioni.numero[1]; salva[2] = visioni.sep;
salva[3] = visioni.giorno[0]; salva[4] = visioni.giorno[1]; salva[5] = visioni.sepbis;
salva[6] = visioni.mese[0]; salva[7] = visioni.mese[1]; salva[8] = visioni.septer;
salva[9] = visioni.anno[0];salva[10] = visioni.anno[1]; salva[11] = visioni.anno[2];
salva[12] = visioni.anno[3]; salva[13] = visioni.sep1; salva[14] = visioni.entro;
salva[15] = '\n';
porky << salva;
std::cout << salva;
for (ks = 0; ks < 16; ks++) { salva[ks] = ' '; }
std::cout << ultima.gg << "-" << ultima.mm << "-" << ultima.aa << " + ";
std::cout << cuori << " giorni = " << biglie.gg << "-" << biglie.mm << "-" << biglie.aa << "\n";
indy = 0;
for (ks = 0; ks < 35; ks++) { buffet[ks] = ' '; }
break;
}
default:
{ buffet[indy] = carattere; indy++; break; }
}
input.get(carattere);
}
porky.close(); input.close();
if (dentro == 0) { return 22; }
return 0;
}
questo è l'output
01:18-09-2022:O
ÌÌÌÌÌÌÌÌ01:18-09-2022:O
ÌÌÌÌÌÌÌÌ02:03-11-2022:O
ÌÌÌÌÌÌÌÌ02:03-11-2022:O
ÌÌÌÌÌÌÌÌ03:03-11-2022:O
ÌÌÌÌÌÌÌÌ03:03-11-2022:O
ÌÌÌÌÌÌÌÌ04:27-08-2022:$
ho controllato col debug ma la scrittura avviene una sola volta cosi come i buffer vengono cancellati regolarmente
dopo ogni scrittura su file!
come posso risolvere?
grazie anticipatamente a tutti.