PDA

Visualizza la versione completa : [C++] Senza cout() non salva il file


freetom
17-01-2011, 14:45
if (ritardi.size() !=0) {

cout << "\n\n Sto salvando in file txt ... \n\n";

ofstream fout;
fout.open("ritardi-quartine-senza-cout.txt", ios::app);

fout << quartine[0];
fout << ",";
fout << quartine[1];
fout << ",";
fout << quartine[2];
fout << ",";
fout << quartine[3];
fout << "---";
fout << " RA: ";
fout << ritardi[1];
fout << "---";
fout << " RS: ";
fout << ritardi[0];
//fout << "\n";

fout.close();

}


cout << "fine elaborazione";

cin.get();



Dunque ... lo stesso prg se procede molto + lentamente con qualche cout (mostra a video) in pi riesce a salvarmi ogni riga di report (una ogni 3 min ca) nel file txt corrispondente...

Mentre se tolgo tutti i cout... l'elaborazione diventa velocissima ma in compenso nel file .txt
non vengono salvati tutti i dati... ma solo le prime 3 righe (in un nanosecondo!) (in modo regolare)

es:

1,2,3,4--- RA: 68--- RS: 219

1,2,3,5--- RA: 68--- RS: 315

1,2,3,6--- RA: 68--- RS: 349


Qualcuno/a saprebbe dirmi come mai il mio programma mi mostra a video fine elaborazione...
dopo pochi sec. ma non mi salva tutto nel file anche se ho messo fout.close()?

E' come se il file si chiudesse... troppo presto... (ho provato anche a togliere fout.close() ma non salva tutto ugualmente...)

Grazie infinite!


:ciauz:

lolide
17-01-2011, 15:46
se fout un oggetto fstream (perch non postate il codice di tutte le classi che definite ed usate :dh: :dh: ), devi usare la funzione flush() (http://www.cplusplus.com/reference/iostream/ostream/flush/) per svuotare il buffer di scrittura prima di chiuderlo con close()

freetom
17-01-2011, 15:59
Originariamente inviato da lolide
se fout un oggetto fstream (perch non postate il codice di tutte le classi che definite ed usate :dh: :dh: ), devi usare la funzione flush() (http://www.cplusplus.com/reference/iostream/ostream/flush/) per svuotare il buffer di scrittura prima di chiuderlo con close()

In cima comunque ho:




#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>
#include <iomanip>




Provato a mettere flush();

in queste due posizioni...




if (ritardi.size() !=0) {
//cout << "\n\n Sto salvando in file txt ... \n\n";
fout << quartine[0];
fout << ",";
fout << quartine[1];
fout << ",";
fout << quartine[2];
fout << ",";
fout << quartine[3];
fout << "---";
fout << " RA: ";
fout << ritardi[1];
fout << "---";
fout << " RS: ";
fout << ritardi[0];


fout.flush(); //qui...

}


fout.flush(); //o qui...

fout.close();




:confused: :stordita:

:ciauz:

lolide
17-01-2011, 16:09
Quindi ?
Funziona o no ?

freetom
17-01-2011, 16:11
Originariamente inviato da lolide
Quindi ?
Funziona o no ?

l'avevo messo nel titolo

"Provato.. ma stesso risultato :-( "

:bh:

KrOW
17-01-2011, 16:17
Scusa ma il codice della scrittura su file, racchiuso in un loop??? Usi devcpp???

freetom
17-01-2011, 16:20
Originariamente inviato da KrOW
Scusa ma il codice della scrittura su file, racchiuso in un loop??? Usi devcpp???

si




if (ritardi.size() !=0) {

cout << "\n\n Sto salvando in file txt ... \n\n";
fout << quartine[0] << flush;;
fout << ",";
fout << quartine[1] << flush;;
fout << ",";
fout << quartine[2] << flush;;
fout << ",";
fout << quartine[3] << flush;;
fout << "---";
fout << " RA: ";
fout << ritardi[1] << flush;;
fout << "---";
fout << " RS: ";
fout << ritardi[0] << flush;;

fout.flush();
}

//questo racchiuso in un loop che dovrebbe scrivere nel file un sacco di righe...
//per un sacco di quartine diverse... (invece mi scrive solo le prime 3 :-| )




si

uso devcpp

:ciauz:

KrOW
17-01-2011, 16:34
intanto ti consiglio di cambiare IDE/compilatore (ho perso il conto di quante volte stata detta questa frase in riferimento al devcpp) ... Poi, potresti postare tutto il codice relativo alla scrittura su file (apertura, loop ecc...)???

freetom
17-01-2011, 16:43
Originariamente inviato da KrOW
intanto ti consiglio di cambiare IDE/compilatore (ho perso il conto di quante volte stata detta questa frase in riferimento al devcpp) ... Poi, potresti postare tutto il codice relativo alla scrittura su file (apertura, loop ecc...)???





// reading a complete binary file
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>
#include <iomanip>

using namespace std;

ifstream::pos_type size;
char * memblock;
char * memblock2;
char * memblock3;

string intToString(char value) {
stringstream ss;
ss << value;
return ss.str();
}

int stoint( const std::string &text )
{
std::stringstream sstream;
sstream << text;

int integer;
sstream >> integer;

return integer;
}


int main () {


//APERTURA FILE TXT

ofstream fout;
fout.open("ritardi-quartine-senza-cout.txt", ios::app);

//---------------------------------------------------

vector<string>token;
string valorestringa ="";
string stringaquartina;
string stringaestrazione;
vector <string> compara;
int ritardo;
vector <int> ritardi(2);
int n;
n=0;
string stringaquartinasingola="";
string stringaestrazionesingola="";
string testo,estratta;
vector<string> token1;
vector<string> token2;
int inizio,fine,i,lparola;
bool continua;
testo = stringaestrazione;
stringaquartinasingola="";
vector<string> estrazioni;
vector<string> quartine;
vector<string> confronta;
vector<int> confrontainteri;

int occorrenza=0;

ritardo=0;

int g=0;


ifstream file2 ("estrazioni.txt", ios::in|ios::binary|ios::ate);
if (file2.is_open())
{
size = file2.tellg();
memblock2 = new char [size];
file2.seekg (0, ios::beg);
file2.read (memblock2, size);
file2.close();
for (int i=0; i<size;i++) {
//cout << memblock[i];
valorestringa = intToString(memblock2[i]);
stringaestrazione += valorestringa;
}

cout << "\n\n";
cout << "carico estrazioni in memoria...";
cout << "\n\n";

cin.get();

testo=stringaestrazione;
continua = true;
inizio = -1; /*1*/
while(continua){
fine = testo.find(',',inizio+1); /*2*/
//fine = testo.find(',',inizio+1);
// ultima parola
if(fine==-1){ /*3*/
continua = false;
fine = testo.length(); /*4*/
}
// Estrazione parola
lparola = (fine-inizio)-1; /*5*/
estratta = testo.substr(inizio+1,lparola); /*6*/
token1.push_back(estratta); /*7*/
inizio = fine; /*8*/
}
}

cout << "\n\n";


cout << "\n\n";


ifstream file3 ("quartine.txt", ios::in|ios::binary|ios::ate);
if (file3.is_open())
{
size = file3.tellg();
memblock3 = new char [size];
file3.seekg (0, ios::beg);
file3.read (memblock3, size);
file3.close();
for (int i=0; i<size;i++) {

valorestringa = intToString(memblock3[i]);
stringaquartina += valorestringa;
}
cout << "\n\n";
cout << "carico quartine in memoria...";
cout << "\n\n";

cin.get();


cout << "Inizio elaborazione...";

testo=stringaquartina;
continua = true;
inizio = -1; /*1*/
while(continua){
fine = testo.find(',',inizio+1); /*2*/
// ultima parola
if(fine==-1){ /*3*/
continua = false;
fine = testo.length(); /*4*/
}
// Estrazione parola
lparola = (fine-inizio)-1; /*5*/
estratta = testo.substr(inizio+1,lparola); /*6*/
token2.push_back(estratta); /*7*/
inizio = fine; /*8*/
}
}


for (int a=0; a< token2.size(); a++) {

if (a%4==0) {

quartine.clear();
confronta.clear();
confrontainteri.clear();

}


quartine.push_back(token2[a]);


if (quartine.size()==4) {

for (int y=0; y<quartine.size(); y++) {


for (int a=0; a< token1.size(); a++) {

if (a%5==0) {

estrazioni.clear();
confronta.clear();
confrontainteri.clear();

}

estrazioni.push_back(token1[a]);

if (estrazioni.size()==5) {


estrazioni[0].replace(0, 2, "");

confronta.push_back(estrazioni[0]);
confronta.push_back(estrazioni[1]);
confronta.push_back(estrazioni[2]);
confronta.push_back(estrazioni[3]);
confronta.push_back(estrazioni[4]);
confronta.push_back(quartine[0]);
confronta.push_back(quartine[1]);
confronta.push_back(quartine[2]);
confronta.push_back(quartine[3]);

for (int j=0; j<confronta.size(); j++) {


int confrontaintero = stoint(confronta[j]);
confrontainteri.push_back(confrontaintero);

}
cout << "\n\n";


int contadoppioni=0;
sort(confrontainteri.begin(),confrontainteri.end() );

int MISURAVECTOR;
MISURAVECTOR=confrontainteri.size();


for (int i = 0; i < MISURAVECTOR-1; i++) {


if (confrontainteri[i] == confrontainteri[i+1]) {
contadoppioni++;

}
else {

}

}

if (contadoppioni==1) {
ritardo++;
if (ritardo > ritardi[0]) {
ritardi[0]=ritardo;
}
ritardi[1]=ritardo;

}

else if (contadoppioni==2) {

ritardo=0;
ritardi[1]=ritardo;

}

else if (contadoppioni>=3) {

ritardo=0;
ritardi[1]=ritardo;

}

else {

ritardo++;
if (ritardo > ritardi[0]) {
ritardi[0]=ritardo;
}
ritardi[1]=ritardo;

}

}

for (int y=0; y<estrazioni.size(); y++) {

}

for (int y=0; y<quartine.size(); y++) {

}

}

if (ritardi.size() !=0) {

//SCRITTURA FILE TXT

fout << quartine[0] << flush;;
fout << ",";
fout << quartine[1] << flush;;
fout << ",";
fout << quartine[2] << flush;;
fout << ",";
fout << quartine[3] << flush;;
fout << "---";
fout << " RA: ";
fout << ritardi[1] << flush;;
fout << "---";
fout << " RS: ";
fout << ritardi[0] << flush;;

//---------------------------------------------------

}

ritardi[0]=0;
ritardi[1]=0;

quartine.clear();
confronta.clear();
confrontainteri.clear();
ritardo=0;

}
}
}

//CHIUSURA FILE TXT

fout.close();

//---------------------------------------------------

cout << "fine elaborazione";
cin.get();

}




Grazie

Ciao

:ciauz:

KrOW
17-01-2011, 17:11
Scusa ma il codice un po troppo per poterlo elaborare (considera che non ho davanti un computer) ... Prova a determinare se effettivamente il vettore ritardi viene riempito secondo il comportamento stabilito ...

Loading