Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725

    [c++] riordinare un file come si vuole...

    Ho un file sistemino.txt con il seguente contenuto:


    01 02 03 04 05 | 01 02 03 06 07 | 01 02 03 08 09 |
    01 02 03 15 16 | 01 02 03 17 18 | 01 02 03 19 20 |
    01 02 04 06 08 | 01 02 04 06 09 | 01 02 04 07 08 |
    01 02 04 07 09 | 01 02 04 15 17 | 01 02 04 15 18 |
    01 02 04 16 17 | 01 02 04 16 18 | 01 02 04 19 20 |
    01 02 05 06 08 | 01 02 05 06 09 | 01 02 05 07 08 |
    01 02 05 07 09 | 01 02 05 15 17 | 01 02 05 15 18 |
    01 02 05 16 17 | 01 02 05 16 18 | 01 02 05 19 20 |

    io lo vorrei semplicemente riordinare in un altro file sisteminoordinato.txt in questo modo:

    01,02,03,04,05
    01,02,03,06,07
    01,02,03,08,09
    01,02,03,15,16
    01,02,03,17,18
    01,02,03,19,20
    ecc...

    ovvero vorrei semplicemente sostituire in automatico il carattere "|" con un ritorno a capo "\n" e il carattere " " con il carattere ","

    Ho provato a fare così:


    codice:
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
    #include <algorithm>
    #include <sstream>
    #include <iomanip>
    
    
    using namespace std;
    
    string intToString(int value) {
        stringstream ss;
        ss << value;
        return ss.str();
    }
    
    string floatToString(float value) {
        stringstream ss;
        ss << value;
        return ss.str();
    }
    
    
    int main (int argc, char *argv[]) {
    
    vector<string> vec;
    
    ifstream fin("sisteminog4.txt");
    if (fin) {
       string s;
       while(fin) // cattura tutti gli errori.
       {
          getline(fin,s);
          cout << s; 
          
    //cerco di sostituire... il primo carattere voluto...
                
          s.replace(0,s.length(), '|', '\n');
    
    //cerco di sostituire... il secondo carattere voluto...
                
          s.replace(0,s.length(), ' ', ',');
          
          cout << s;
          cin.get();
          vec.push_back(s);
       }
    }
    
    
        ofstream fout;
    	
    	fout.open("sisteminog4ottimizzato.txt", ios::app);
    
    	
    	//ultima riga trasformata...
    	string sistemino= vec[vec.size()-1];
    	fout << sistemino;
    	fout << "\n";
    
    
    cout << "Press ENTER to continue...x CHIUDERE..." << endl;
    cout << "\n\n\n"; 
    cin.get();
    //return 0;
    
    
    }
    Ma non funzia
    Dove sbaglio?

    GRAZIE


  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Se devi solamente sostituire quei due caratteri, ti basta un codice molto piu' semplice

    codice:
    #include <iostream>
    #include <fstream>
    #include <string>
    
    using namespace std;
    
    int main (int argc, char *argv[]) 
    {
    	ofstream fout("fileinout.txt", ios::app);
    	ifstream fin("fileininput.txt");
    	if(fin)
    	{
    	  string s;
    		
    	  while(fin) 
    	  {
    		getline(fin,s);
    
    		for(int j=0; j<s.length()-1; j++)
    		{
    			if(s[j]==' ') s[j]=',';
    			if(s[j]=='|') s[j]='\n';
    		}
    	
    		fout << s;
    	   }
    	}
    	fin.close();
    	fout.close();
    
    	return 0;
    }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725

    quasi perfetto oregon grazie!

    L'unico miglioramente se possibile riguarderebbe questo:

    Adesso il file ottimizzato è qualcosa di questo tipo:

    01,02,03,04,05,
    ,01,02,03,06,07,
    ,01,02,03,08,09,
    01,02,03,15,16,
    ,01,02,03,17,18,
    ,01,02,03,19,20,
    01,02,04,06,08,
    ,01,02,04,06,09,
    ,01,02,04,07,08,
    01,02,04,07,09,
    ,01,02,04,15,17,
    ,01,02,04,15,18,

    io dovrei a questo punto togliere le , e gli spazi iniziali e finali per avere un qualcosa di più pulito in questo modo:

    01,02,03,04,05
    01,02,03,06,07
    01,02,03,08,09
    01,02,03,15,16
    01,02,03,17,18
    01,02,03,19,20
    01,02,04,06,08
    01,02,04,06,09
    01,02,04,07,08
    01,02,04,07,09
    01,02,04,15,17
    01,02,04,15,18

    Comunque sia grazie mille oregon


  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Allora il ciclo dovrà essere

    codice:
    while(fin) 
    {
      getline(fin,s);
    
      int j;
    
      for(j=0; j<s.length()-1; j++)
        if(s[j]==' ') s[j]=',';
    	
      for(j=0; j<35; j+=17)
        fout << s.substr(j, 14) << endl;
    }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725

    così è straperfetto!

    GRAZIE!


  6. #6
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725

    In ultimis...

    Avrei bisogno di trasformare ogni occorrenze 01 in 1 02 in 2 03 in 3 e così via... fino a 09 -> 9

    Ho provato così:

    codice:
    	  while(fin) 
    {
      getline(fin,s);
    
      int j;
    
      for(j=0; j<s.length()-1; j++)
        if(s[j]==' ') s[j]=',';
        
        for(j=0; j<s.length()-1; j++)
        if(s[j]=='01') s[j]='1';
        
        for(j=0; j<s.length()-1; j++)
        if(s[j]=='02') s[j]='2';
        
        for(j=0; j<s.length()-1; j++)
        if(s[j]=='03') s[j]='3';
        
        for(j=0; j<s.length()-1; j++)
        if(s[j]=='04') s[j]='4';
        
        for(j=0; j<s.length()-1; j++)
        if(s[j]=='05') s[j]='5';
        
        for(j=0; j<s.length()-1; j++)
        if(s[j]=='06') s[j]='6';
        
        for(j=0; j<s.length()-1; j++)
        if(s[j]=='07') s[j]='7';
        
        for(j=0; j<s.length()-1; j++)
        if(s[j]=='08') s[j]='8';
        
        for(j=0; j<s.length()-1; j++)
        if(s[j]=='09') s[j]='9';
    	
      for(j=0; j<35; j+=17)
        fout << s.substr(j, 14) << endl;
    }
    ma non funzia...

    Ancora Grazias


  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    A partire dal file iniziale? E perche' mai?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Forse invece di utilizzare trasformazioni di stringhe ti conviene acquisire i dati come numeri e riscriverli con la formattazione che più ti aggrada.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725

    Perchè altrimenti il controllo successivo non mi funzia come deve...

    Originariamente inviato da oregon
    A partire dal file iniziale? E perche' mai?
    Il controllo successivo deve verificare valori pari a 1,2,3,4,5,6,7,8,9 anzichè 01,02,03,04,05,06,07,08,09 come invece sono nel file da ottimizzare...

    GRAZIE!


  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    E allora fai in modo che il controllo successivo ottenga il valore numerico del file a partire dai valori 01, 02 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.