PDA

Visualizza la versione completa : [c++] Io avrei necessita di andare a capo ogni tot valori


freetom
21-04-2013, 19:57
Ricordo vagamente che per ottenere un simile risultato di azione ogni tot valori si può ricorrere all'operatore modulo ma non ricordo la modalità d'implementazione...

In sostanza io avrei questo mio codice da ottimizzare in tal senso:




while(f.good()) //fino a quando c'è qualcosa da leggere ..
{
//legge tutta la riga dal file e la mette nella variabile s
getline(f, s);
contatore++;
if (contatore==11) {
cout<<"\n";
//scrivo ritorno a capo su file;
fa << "\n";
}
else {
cout<<s;
//scrivo riga su file;
cout<<",";

fa << s;
fa << ",";

}

}



Ovvero per multipli di 11 di contatore devo andare a capo...

Qualcuno/a mi aiuterebbe a implementare a tale scopo l'operatore modulo?

Grazie!

:ciauz:

oregon
21-04-2013, 20:53
C'è poco da implementare .... se contatore modulo 11 è uguale a zero ...

freetom
21-04-2013, 21:03
Originariamente inviato da oregon
C'è poco da implementare .... se contatore modulo 11 è uguale a zero ...

Ciao Oregon non ho capito...
come dovrei fare per andare a capo ogni 10 righe sapendo che contatore==11 funziona in modo corretto ma solo per la prima riga?

Grazie

oregon
21-04-2013, 21:11
Allora modulo 10 non modulo 11 ...

Scusa ... vuoi tentare di scrivere tu questa riga?

freetom
21-04-2013, 21:29
Originariamente inviato da oregon
Allora modulo 10 non modulo 11 ...

Scusa ... vuoi tentare di scrivere tu questa riga?

Forse ho trovato come...




if (contatore%11==0) {



Però c'e' un problema...
Ho 7200 righe da 5 elementi ciascuna intervallati da virgola e una volta che attuo l'opzione ritorno a capo ogni modulo 11 mi ritrovo anzichè 720 righe come dovrebbe essere , solo 655 righe.

Da cosa potrebbe dipendere e come potrei risolvere?

Tnx

:ciauz:

oregon
21-04-2013, 21:30
Cosa ti ho scritto appena prima ?

freetom
21-04-2013, 21:43
Originariamente inviato da oregon
Cosa ti ho scritto appena prima ?

Dunque anche con:




if (contatore%10==0) {



con questo file di 7200 righe che inizia con:

32,54,43,90,40
77,52,67,6,75
41,82,64,86,22
35,42,15,69,22
67,24,42,56,68
21,81,16,62,64
30,37,83,87,85
47,53,84,67,16
62,31,73,50,79
49,68,44,15,11
21,44,27,53,88
17,52,51,19,50
15,83,20,39,78
44,65,58,70,31
18,67,30,23,15
57,10,34,87,41
59,75,23,21,78
57,61,54,16,60
1,17,37,43,20
57,19,45,17,42

e la fine...

55,40,15,16,81
5,90,13,84,59
34,83,54,8,19
61,24,73,90,83
46,50,11,70,18
49,11,65,31,10
55,29,58,26,45
27,90,58,53,30
14,57,42,27,63
56,57,72,10,9


invece di andarmi a capo come dovrebbe ad es. alla 10° riga 49,68,44,15,11 mi va a capo alla precedente... e invece di contarmi come ultimo pezzo 56,57,72,10,9 mi conta il precedente...

sto a diventà matto :D

:ciauz:

oregon
21-04-2013, 21:55
Il codice adesso qual è?

E siamo sicuri che nelle stringhe che visualizzi non ci siano dei "ritorni a capo"?

freetom
21-04-2013, 22:03
Originariamente inviato da oregon
Il codice adesso qual è?

E siamo sicuri che nelle stringhe che visualizzi non ci siano dei "ritorni a capo"?

il codice è questo:




#include <iostream>
#include <fstream> //header necessario per ifstream!

using namespace std;

int main() {
//nome del file da aprire, si può mettere anche il percorso (es C:\\file.txt)
ifstream f("righe.txt");
string s;
int contatore=0;

ofstream fa;
fa.open("RISULTANTI.txt", ios::app); //apre il file in scrittura (in modalità appending)

if(!f) {
cout << "Il file non esiste!";
return -1;
}

while(f.good()) //fino a quando c'è qualcosa da leggere ..
{
//legge tutta la riga dal file e la mette nella variabile s
getline(f, s);
contatore++;
if (contatore%10==0) {
cout<<"\n";
//scrivo ritorno a capo su file;
fa << "\n";
}
else {
cout<<s;
//scrivo riga su file;
cout<<",";

fa << s;
fa << ",";

}

}
f.close(); //chiude il file
fa.close();
return 0;
}




e i due file riche.txt e RISULTANTI.txt non hanno "ritorni a capo" in eccesso tranne quelli da gestire come scritto sopra (verificato con notepad ++)

oregon
21-04-2013, 22:19
Si può scaricare il file di dati per provarlo?

Loading