PDA

Visualizza la versione completa : [C++] Salvare stringa su file


andre-83
21-07-2011, 11:36
Buongiorno, per prima cosa ho postato qui perchè ho visto altri topic inerenti al c++ e quindi ho pensato fosse le sez giusta, perdonatemi se ho sbagliato.
Ho questo dubbio in un programma che sto facendo in c++:
ho questo record

struct cds{
string nome_cd;
int numero;
string titolo[25];
string cantante[25];
};
ho bisogno delle stringhe perchè utilizzo degli spazi e quindi non andrei bene con il tipo char
come faccio per salvare le stringhe in un file e per farmele successivamente leggere tramite un'altra void?
ho provato con <<, ma una volta salvato, poi quando vado a leggere i valori da file tramite la funzione getline(FILE_lettura,record) mi mette tutto nel primo elemento del record.
come potrei fare (magari utilizzando anche funzioni diverse) per salvare su file e poi riuscire a "mettere al proprio posto" ogni elemento??
vi ringrazio. scusate se non è molto chiaro, sono ancora agli inizi!
se è necessario posso postare anche il codice delle void che ho utilizzato per salvare e per leggere il file.

MisterBean
21-07-2011, 16:05
Come mai usi le dichiarazioni

string titolo[25];
string cantante[25];? Quelle non sono stringhe, sono array di stringhe (di 25 elementi ciascuno).
Comunque posta anche il codice per leggere e scrivere su file.

andre-83
22-07-2011, 20:43
Originariamente inviato da MisterBean
Come mai usi le dichiarazioni

string titolo[25];
string cantante[25];? Quelle non sono stringhe, sono array di stringhe (di 25 elementi ciascuno).
Comunque posta anche il codice per leggere e scrivere su file.
Utilizzo l'array di stringhe perchè il programma deve fare questo:
creo un array di record e ogni record deve contenere queste informazioni:
-nome del cd (e quindi una stringa)
-numero (un int)
-N tracce (dove N="numero", utilizzo l'array di stringhe perchè ho bisogno che in ogni record siano salvate gli N nome diversi delle N tracce diverse)
-N artisti (stessa cosa delle "N tracce")
Questo è il codice della funzione che salva il file:


void salva_file(record cd[], int&riemp)
{
fstream scrittura;
scrittura.open("database.txt",ios::out);
for(int i=0;i<riemp;i++){
scrittura<<cd[i].nome_cd <<endl;
scrittura<<cd[i].numero <<endl;
for(int j=0;j<cd[i].numero;j++){
scrittura<<cd[i].canzone[j] <<cd[i].artista[j];
}
scrittura<<endl;
}
scrittura.close();
cout<<"scrittura completata";
}

Questo invece è il codice della funzione che legge da file:


void carica_file(record cd[], int&riemp)
{
riemp=0;
fstream lettura;
lettura.open("database.txt",ios::in);
while(!lettura.eof()){
getline(lettura,cd[riemp].nome_cd);
lettura>>cd[riemp].numero;
for(int i=0;i<cd[riemp].numero;i++){
getline(lettura,cd[riemp].canzone[i]);
getline(lettura,cd[riemp].artista[i]);
}
}
cout<<controllo;

riemp++;
}
lettura.close();
cout<<"lettura completata";
}


"riemp" è il riempimento del vettore di record che inizializzo in fase di lettura, ma che poi gestirò in maniera diversa quando riuscirò a capire dove sbaglio! XD
ps "salva_file" credo sia giusta perchè il file che mi scrive sembra tutto ok...
vi ringrazio per la pazienza =)

oregon
22-07-2011, 20:51
Ma

canzone

artista

cosa sono? Nella struttura c'è

titolo

cantante

Qual è il sorgente (anche parziale di test) corretto e *completamente compilabile* ?

E perché all'inizio hai scritto

"ho bisogno delle stringhe perchè utilizzo degli spazi e quindi non andrei bene con il tipo char"

?

andre-83
22-07-2011, 23:33
Originariamente inviato da oregon
Ma

canzone

artista

cosa sono? Nella struttura c'è

titolo

cantante

Qual è il sorgente (anche parziale di test) corretto e *completamente compilabile* ?

E perché all'inizio hai scritto

"ho bisogno delle stringhe perchè utilizzo degli spazi e quindi non andrei bene con il tipo char"

?
scusatemi, ho provato a farlo piu volte quindi in questi giorni l'ho modificato parecchio. artista e cantante sono la stessa cosa, così come canzone e titolo.
ho bisogno della stringa perchè se volessi salvare ad esempio il campo nome_cd come "Prova cd uno", nel momento in cui utilizzo un array char (e non il tipo string) e faccio "cin>>" il nome si chiuderebbe a "Prova" perchè lo spazio viene contato come chiusura dell'array e mi assegnerebbe automaticamente " cd uno" a successivi "cin>>" che vado a fare, dandomi dei risultati che non voglio.

oregon
23-07-2011, 08:55
Originariamente inviato da andre-83
ho bisogno della stringa perchè se volessi salvare ad esempio il campo nome_cd come "Prova cd uno", nel momento in cui utilizzo un array char (e non il tipo string) e faccio "cin>>" il nome si chiuderebbe a "Prova" perchè lo spazio viene contato come chiusura dell'array e mi assegnerebbe automaticamente " cd uno" a successivi "cin>>" che vado a fare, dandomi dei risultati che non voglio.

Non mi pare un buon motivo ... proprio per questo puoi usare la

getline
http://www.cplusplus.com/reference/iostream/istream/getline/


scusatemi, ho provato a farlo piu volte quindi in questi giorni l'ho modificato parecchio. artista e cantante sono la stessa cosa, così come canzone e titolo.

Comunque, fornisci un sorgente di prova *corretto*, completo e compilabile e indica i problemi, altrimenti non si riesce a dare una risposta concreta ...

andre-83
23-07-2011, 12:24
Originariamente inviato da oregon
Comunque, fornisci un sorgente di prova *corretto*, completo e compilabile e indica i problemi, altrimenti non si riesce a dare una risposta concreta ...
No, ma hai ragione lo so, è solo che in questi giorni l'ho modificato, quindi non mi sono accorto di quel cambiamento. scusate.



Originariamente inviato da oregon
Non mi pare un buon motivo ... proprio per questo puoi usare la

getline
http://www.cplusplus.com/reference/iostream/istream/getline/


Quindi in definitiva che mi consigli di fare? sostituire le stringhe "nome_cd", "canzone", "cantante" con array di char e utilizzare la getline al posto del cin ??
ma se facessi così poi dovrei dichiarare canzone e cantante come array di char molto lunghi. mi converrebe lo stesso?
grazie

Loading