PDA

Visualizza la versione completa : [C++] Lettura da file


Tiime
02-05-2014, 11:25
Ho creato un semplicissimo programma che dopo aver fatto inserire i dati di una struttura, li copia nel file, ed in seguito li ordina, ma solo nella struttura, lasciando il vecchio ordinamento nel file.
Quando vado a leggere da file, leggo come se anche esso fosse stato ordinato ed inoltre il ciclo di uscita va in loop, continuando a stampare dati random.



#include <iostream>
#include <string.h>
#include <fstream.h>

using namespace std;

class Madre
{
protected:
fstream file;
struct studente
{
char nome[10];
int eta;
}pprova[5];

public:
Madre();
void inserimento();
void lettura();
};

void Madre:: inserimento()
{
file.open("Prova.txt", ios:: app);
int i;

for(i=0;i<2;i++)
{
cout << "Inserisci il " << i+1 << "^ nome ";
cin >> pprova[i].nome;

cout << "Inserisci la " << i+1 << "^ eta ";
cin >> pprova[i].eta;

cout << endl;

file << pprova[i].nome << " " << pprova[i].eta;
}
if(strcmp(pprova[0].nome, pprova[1].nome) > 0)
{
pprova[3] = pprova[0];
pprova[0] = pprova[1];
pprova[1] = pprova[3];
}

for(i=0;i<2;i++)
cout << "Dati " << i+1 << "^ persona:\n" << "Nome: " << pprova[i].nome << "\nEta: " << pprova[i].eta << "\n\n";

file.close();
}

void Madre:: lettura()
{
file.open("Prova.txt", ios:: in);
cout << "\n\nVisualizzazione file:\n";
int i=0;

while(!file.eof())
{
file >> pprova[i].nome >> pprova[i].eta;
cout << pprova[i].nome << " " << pprova[i].eta << endl;
i++;
system("PAUSE");
}
file.close();
}

int main()
{
Madre a;
a.inserimento();
system("PAUSE");
a.lettura();
}

oregon
02-05-2014, 12:58
Ti consiglio di leggere così i dati



file >> pprova[i].nome >> pprova[i].eta;
while(file)
{
cout << pprova[i].nome << " " << pprova[i].eta << endl;
i++;
file >> pprova[i].nome >> pprova[i].eta;
}


Inoltre assicurati che il file venga cancellato prima di fare una prova visto che i dati sono aggiunti ai precedenti.

Tiime
02-05-2014, 13:06
Ti consiglio di leggere così i dati



file >> pprova[i].nome >> pprova[i].eta;
while(file)
{
cout << pprova[i].nome << " " << pprova[i].eta << endl;
i++;
file >> pprova[i].nome >> pprova[i].eta;
}


Inoltre assicurati che il file venga cancellato prima di fare una prova visto che i dati sono aggiunti ai precedenti.
Con questo ciclo non stampa nemmeno il 1° record

oregon
02-05-2014, 13:53
Veramente a me funziona perfettamente.

Probabilmente il tuo compilatore C++ ha qualche bug nella gestione dei file ...

Tiime
02-05-2014, 14:08
Veramente a me funziona perfettamente.

Probabilmente il tuo compilatore C++ ha qualche bug nella gestione dei file ...
Aspetto il parere di qualcun altro allora.
Nel mentre faccio una domanda sulla lettura su file: caricando in memoria centrale un record come ad esempio

file >> pprova[i].nome >> pprova[i].eta;
Ciò che in precedenza conteneva, non andrebbe perso?

Mi spiego meglio. Nel caso del mio programma, pprova[i].nome potrebbe non contenere ciò che conteneva in precedenza. Leggendo con l'istruzione di sopra, qualora il pprova[i].nome fosse diverso da ciò che effettivamente c'è scritto in quel punto del file, il contenuto di pprova[i].nome verrebbe cambiato?

oregon
02-05-2014, 14:36
Se la lettura avviene, il contenuto precedente viene ovviamente cambiato.

Ma devi accertarti che effettivamente la lettura avvenga.

Esegui passo passo il programma.

Tiime
02-05-2014, 19:21
Se la lettura avviene, il contenuto precedente viene ovviamente cambiato.

Ma devi accertarti che effettivamente la lettura avvenga.

Esegui passo passo il programma.
L'errore era che nel fopen non ho scritto come modalità di apertura out e quindi il file non veniva nemmeno creato. Comunque... Che condizione posso usare dal ciclo perché sia file che file.eof, leggono una volta in più del dovuto

Tiime
04-05-2014, 14:40
UP

oregon
04-05-2014, 16:09
Di quale codice parli ? Del ciclo che ti ho suggerito o di quello che hai usato tu?

Tiime
05-05-2014, 23:15
Di quale codice parli ? Del ciclo che ti ho suggerito o di quello che hai usato tu?
Entrambi leggono una volta in più del dovuto

Loading