Trasferimento stringa in struct

di il
10 risposte

Trasferimento stringa in struct

Ciao mi trovo di fronte a questo problema: acquisire da file dati relativi ad una biblioteca (searati da ';') e salvarli in una struct. riesco a separare la stringa, arrivo al punto di trasferirla all'interno della struct e non riesco nè con l'operatore = (uso string) nè con strcpy... ho fatto alcune prove e il valore della stringa è corretto, ma non viene trasferito nella struct (per semplificare metto solo la parte di codice incriminata, per questo sembrerà che alcune variabili sono inutili)
while (riga[j]!=';'){
	s[k]=riga[j];
	j++;
	k++;
}
libri[n].isbn=s;

10 Risposte

  • Re: Trasferimento stringa in struct

    Perche passi il vettore per valore e non per riferimento. Manda un esempio completo che dimostri il problema così riusciamo a guidarti meglio.
  • Re: Trasferimento stringa in struct

    Questo è il corpo della funzione che acquisisce i file dal file test.txt.. i dati sono separati da ';' e ci sono 5 dati per riga (isbn,titolo,autore,anno,casa editrice) .... Il problema arriva quando devo assegnare la stringa s a uno dei campi della struct (dichiarata globale), passo che non funziona
    int k,j,i,a=0,n=0,h;
    string riga,s,lineaprecedente="";
    ifstream infile;
    infile.open("test.txt");
    while(a<1){
    	j=0;
            getline(infile,riga);				
            if (riga != lineaprecedente){
                lineaprecedente=riga;
    	    for (i=0;i<5;i++){
    				k=0;
    				while (riga[j]!=';'){	
    						s[k]=riga[j];
    						j++;
    						k++;
    					}
    					j++;			
    					switch (i){
    						case 0:
    							   libri[n].isbn=s;	// <--- non funziona
    							   break;
    						case 1:
    							   libri[n].titolo=s;	
    							   break;
    						case 2:
    							   libri[n].autore=s;	
    							   break;
    						case 3:
    							   libri[n].anno=s;	
    							   break;
    						case 4:
    							   libri[n].casa=s;	
    							   break;
    					}
    			   }
    			n++;
    			}
    			else
    				a++;
        }
        infile.close();
  • Re: Trasferimento stringa in struct

    Scusami se insisto. Puoi postare tutte le dichiarazioni, ovvero tutto il programma. Se è globale non vedo perche non deve funzionare. Ci sarà qualché errore da qualche parte.
    Un esempio preso da internet
    #include <string>
    #include <sstream>
    #include <vector>
    #include <iterator>
    #include <iostream>
    #include <algorithm>
    int main()
    {
        std::string s = "Hello;How;Are;You;Today";
        std::vector<std::string> v;
        std::istringstream buf(s);
        for(std::string token; getline(buf, token, ';'); )
            v.push_back(token);
        copy(v.begin(), v.end(), std::ostream_iterator<std::string>(std::cout, "."));
        std::cout << '\n';
    }
  • Re: Trasferimento stringa in struct

    Questo è il programma intero
    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
    void acquisisci();
    
    struct{
    	string isbn;
    	string titolo;
    	string autore;
    	string anno;
    	string casa_editrice;
    } libri[10];
    
    int main(){
    	acquisisci();
    	cout << libri[0].autore;
    	system("pause");
    	return 0;
    }
    
    void acquisisci(){		
    	 int k,j,i,a=0,n=0,h;
        string riga,s;
        ifstream infile;
        infile.open("test.txt");
        string lineaprecedente="";
        while(a<1){
    		  j=0;
            getline(infile,riga);				
            if (riga != lineaprecedente){
                lineaprecedente=riga;
    		      for (i=0;i<5;i++){
    					k=0;
    					while (riga[j]!=';'){
    						s[k]=riga[j];
    						j++;
    						k++;
    					}
    					j++;			
    					switch (i){
    						case 0:
    							   libri[n].isbn=s;
    								break;
    						case 1:
    								libri[n].titolo=s;
    								break;
    						case 2:
    								libri[n].autore=s;
    								break;
    						case 3:
    								libri[n].anno=s;
    								break;
    						case 4:
    								libri[n].casa_editrice=s;
    								break;
    					}
    			   }
    			n++;
    			}
    			else
    				a++;
        }
        infile.close();
    }
    
  • Re: Trasferimento stringa in struct

    typedef struct{
    	string isbn;
    	string titolo;
    	string autore;
    	string anno;
    	string casa_editrice;
    }_libri;
    _libri libri[10];
    Adesso prosegui col resto.
  • Re: Trasferimento stringa in struct

    Io definisco il nuovo tipo _libri con typedef, poi creo un array del tipo _libri ma globalmente o all'interno del main? (so solo vagamente a cosa serve il typedef)
    perché se globale non cambia nulla credo... no?
  • Re: Trasferimento stringa in struct

    Globalmente. Prova se va. se no devo provare a compilarlo e vedere dov'è l'errore
  • Re: Trasferimento stringa in struct

    No non mi funziona, ho provato a mettere una semplice cout di un elemento qualsiasi e in tutti i casi provati non ha prodotto risultati... questo è il mio codice
    
    #include <iostream>
    #include <fstream>
    #include <cstring>
    using namespace std;
    void acquisisci();
    
    typedef struct{
       string isbn;
       string titolo;
       string autore;
       string anno;
       string casa_editrice;
    }_libri;
    _libri libri[10];
    
    int main(){
    	acquisisci();
    	cout << libri[2].autore;
    	system("pause");
    	return 0;
    }
    
    void acquisisci(){		
    	 int k,j,i,a=0,n=0,h;
        string riga,s;
        ifstream infile;
        infile.open("test.txt");
        string lineaprecedente="";
        while(a<1){
    		  j=0;
            getline(infile,riga);				
            if (riga != lineaprecedente){
                lineaprecedente=riga;
    		      for (i=0;i<5;i++){
    					k=0;
    					while (riga[j]!=';'){
    						s[k]=riga[j];
    						j++;
    						k++;
    					}
    					j++;			
    					switch (i){
    						case 0:
    							   libri[n].isbn=s;
    								break;
    						case 1:
    								libri[n].titolo=s;
    								break;
    						case 2:
    								libri[n].autore=s;
    								break;
    						case 3:
    								libri[n].anno=s;
    								break;
    						case 4:
    								libri[n].casa_editrice=s;
    								break;
    					}
    			   }
    			n++;
    			}
    			else
    				a++;
        }
        infile.close();
    }
    
  • Re: Trasferimento stringa in struct

    Il problema è nella while in cui manca il ridimensionamento della stringa s

    Aggiungi una resize così
    
       while (riga[j]!=';'){
          s.resize(k+1);
    
    Inoltre, non devi usare l'include <cstring> ma include <string>
  • Re: Trasferimento stringa in struct

    Grande Oregon
Devi accedere o registrarti per scrivere nel forum
10 risposte