Problema con ofstream

di il
3 risposte

Problema con ofstream

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.

3 Risposte

  • Re: Problema con ofstream

    Se salvi una stringa la devi chiudere con il NUL. Altrimenti stampa quello che trova in memoria fino ad un NUL.

    Quindi

    salva[15] = '\0';

    e

    porky << salva << std::endl;

    P.S. Ma a cosa servono tutte quelle funzioni esterne CharToInt e simili?? Non serve in C fare una CharToInt ...
  • Re: Problema con ofstream

    Grazie me lo scordo sempredi chiuderle le stringhe.
    le chiamate tipo ChartoInt mi servono per formattare i dati.
  • Re: Problema con ofstream

    Ma perché una funzione apposita? Boh
Devi accedere o registrarti per scrivere nel forum
3 risposte