[C++]Array file di testo

di il
3 risposte

[C++]Array file di testo

Salve a tutti

vorrei sapere come posso creare da un file importato una matrice in cui ogni parola viene separata dall'altra e identificabile con la sua posizione

faccio un esempio per chiarezza
il mio file è: prova.txt
"questo è un file di esempio
questo è un nuovo rigo
rigo che contiene una virgola, di separazione
rigo che contiene una parentesi (
rigo che contiene numeri 123, -456
questo è l'ultimo rigo"

il mio array deve essere composto in questo esempio da 8x6 (8 max numero di parole per rigo, 6 numero di righe) parole e se voglio sapere cosa c'è ad array[2][3] mi deve dare "che"
è possibile anche seperare le parole dalle virgole, parentesi e tenere il segno "-" per i numeri negativi?

grazie 1000 per l'aiuto

3 Risposte

  • Re: [C++]Array file di testo

    Non è una cosa immediatissima, ecco...

    io andrei per gradi:

    1)leggo una riga dal file e la inserisco in una stringa
    2)effettuo un ciclo controllando che nella stringa letta ci siano dentro caratteri da splittare come '(', ',' e mi ricavo le parole in questo modo, andandole poi ad inserire in un vettore di vettori
    
    
    int ROW_DIM = 255;
    std::string rigaLetta; //riempita dalla lettura su file ovviamente
    std::ifstream infile("miofile.txt");
    int i = 0;
    std::vector<std::string> resultRow;
    std::vector<std::vector<std::string>> resultMatrix;
    std::string tmpStr;
    char tmpCar;
    
    while(infile)
    {
        infile.getline(rigaLetta, ROW_DIM);
        for(; i < rigaLetta.length(); i++)
        {
            tmpStr = "";
            tmpCar = rigaLetta[i];
    
            if(tmpCar == '(' || tmpCar == ' ' ...etc)
            { 
                resultRow.push_back(tmpStr);
            }
            else //ci deve entrare anche quando trova caratteri '-'
            {
                tmpStr += tmpCar;
            }
        }
        resultMatrix.push_back(resultRow);
    }
    

    PS: Bada che il codice l'ho scritto al momento e non l'ho nemmeno testato, quindi potrebbe avere qualche bug. Il procedimento comunque è quello corretto.
  • Re: [C++]Array file di testo

    Dopo il primo inserimento del carattere in tmpstr questa si azzerra e diventa vuota. Io direi di usare una funzione tokenize x le string che ti ritorna un vector e che accetta i deliminatori di campo
    
    std::vector<std::string> Tokenize(const std::string& str,const std::string& delimiters)
    {
    	std::string client = str;
    	std::vector<std::string> result;
    
    	while (!client.empty())
    	{
    		std::string::size_type dPos = client.find_first_of( delimiters );
    		if (dPos == 0) 
    		{ 
    			client = client.substr(delimiters.length()); 
    			result.push_back("");
    		} 
    		else
    		{ 
    			std::string::size_type dPos = client.find_first_of( delimiters );
    			std::string element = client.substr(0, dPos);
    			result.push_back(element);
    			if (dPos == std::string::npos) 
    			{ 
    				return result;
    			} 
    			else
    			{
    				client = client.substr(dPos+delimiters.length());
    			}
    		}
    	}
    		if (client.empty()) 
    		{ 
    			result.push_back("");
    		}
    	return result;
    }
    
    per chiamarlo
    
    std::string delimiters = "(), ";
    std::vector<std::string> fields = Tokenize(rigaLetta,delimiters);
    
    all'uscita avrà il vettore da inserire nella matrice
  • Re: [C++]Array file di testo

    Si, hai ragione. Come avevo detto non l'ho neanche testato quindi ecco il codice (spero) definitivo:
    
    
    int ROW_DIM = 255;
    std::string rigaLetta; //riempita dalla lettura su file ovviamente
    std::ifstream infile("miofile.txt");
    int i = 0;
    std::vector<std::string> resultRow;
    std::vector<std::vector<std::string>> resultMatrix;
    std::string tmpStr = "";
    char tmpCar;
    
    while(infile)
    {
        infile.getline(rigaLetta, ROW_DIM);
        for(; i < rigaLetta.length(); i++)
        {
            tmpCar = rigaLetta[i];
    
            if(tmpCar == '(' || tmpCar == ' ' ...etc)
            { 
                resultRow.push_back(tmpStr);
                tmpStr = "";
            }
            else //ci deve entrare anche quando trova caratteri '-'
            {
                tmpStr += tmpCar;
            }
        }
        resultMatrix.push_back(resultRow);
    }
    
    
Devi accedere o registrarti per scrivere nel forum
3 risposte