Anzeige:
Ergebnis 1 bis 7 von 7

Thema: TextDatei lesen

  1. #1
    Registrierter Benutzer
    Registriert seit
    05.07.2004
    Beiträge
    29

    TextDatei lesen

    hallo
    ich braüchte Ihre Hilfe dringend!
    ich habe ein programm mit C++ geschrieben,das die folgende textdatei einliest und ausgibt.

    Dateiname : Tabelle 1.1
    Datum : 07.02.05
    korrektur : ja


    spannung
    mess1 mess2 mess3 mess3
    23 2 59 1
    56 63 7 1
    53 63 10 1

    Code:
    #include <fstream.h> 
    #include <iostream>    // wegen cout/cin 
    #include <string.h>    // wegen strcmp 
    #include <vector> 
    #include <cstddef>     // wegen size_t 
    
    //using namespace std; 
    
    int lesen();   // Funktionsprototyp 
    
    int main() 
    {   
       lesen(); 
       return 0; 
    }   
    
    //------------- lesen-Funktion ------------------------------------------------ 
    int lesen() 
    {         
        char line[201], file[50]; 
      
    
       ifstream inputstrom;                  // der argumentlose Konstruktor "fstream" erzeugt das Objekt"dat"   
       std::vector<std::vector<int> > matrix; 
       size_t vectorSize = 4;   
       size_t zeile=0; 
       int spalte=0; 
    
       //-------------  Datei öffnen ------------------------ 
       do 
       {  inputstrom.clear(); 
          cout<<"Dateiname inklusive Pfad eingeben: "; 
          cin>>file; 
            
         inputstrom.open(file,ios::in|ios::nocreate); // die Methode"open" wird mit 2 Argumente aufgerufen 
                                                  //  (Dateiname,Dateimodus)   
          if(inputstrom.fail())                     // Fehlertest durchführen   
          cout<<"Datei existiert nicht!"<<endl; 
              
       }while(inputstrom.fail()); 
        
       //-------------- Datei lesen  ---------------------------- 
       do 
       {   
           inputstrom.getline(line,6); 
    
          if(!strcmp(line,"mess1"))   
          { 
             std::cout<<"\n"<<line<<"\n"; 
    
             inputstrom.getline(line,50); 
    
            
                for(zeile = 0;inputstrom; ++zeile) // wenn input-Strom"inputstrom" true wird die Schleife durchgefürt 
                { 
                   matrix.resize(zeile + 1);          // Speicher für vector in matrix reservieren 
    
                    // Speicher für den inneren vector reservieren 
                   matrix[zeile].resize(4);         // 4 Steht für die Anzahl der Elemente (Spalten)pro Zeile 
    
                      // innere vector lesen 
                   for(spalte= 0; (spalte < vectorSize) && inputstrom; ++spalte)  //Das "inputstrom" soll verhindern, dass die innere Schleife 
                                                                    // über das Ende der Datei hinausliest 
                   { 
                     inputstrom>> matrix[zeile][spalte]; 
                     std::cout <<matrix[zeile][spalte]<< ' '; 
                   } 
                   std::cout << "\r\n"; 
                } 
            //    std::cout <<matrix[zeile][spalte]; 
    
          } 
          inputstrom.clear(); 
          inputstrom.getline(line,50); 
          
       }while(!inputstrom.eof()); 
    
        
       inputstrom.close();   // "dat" wird wieder freigemacht (und Datei geschlossen). 
    
       cout<<"\n\n"<<endl; 
              
       return 0; 
    }
    aber was ich nicht verstehe, dass das prog bei der Ausgabe noch eine Null ganz am Ende mit ausgibt!! ???

    23 2 59 1
    56 63 7 1
    53 63 10 1
    0

    Noch dazu möchte die Matrix am Ende complett mit:
    std::cout <<matrix[zeile][spalte];
    ausgeben das geht auch nicht!!

    Hilfe!!!
    danke schön

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von mile04
    hallo
    aber was ich nicht verstehe, dass das prog bei der Ausgabe noch eine Null ganz am Ende mit ausgibt!! ???
    Der Input wird nach der letzten Zahl vermutlich noch nicht aus sein, sondern wahrscheinlich noch ein newline enthalten.
    Dadurch wird eine neue Zeile angefangen und erst nach dem erfolglosen Versuch, noch eine Zahl zu lesesn, ist die innere Schleifenbedingung nicht mehr gegeben.

    Vermutlich wäre es besser einfach mit getline(inputstream, string) eine ganze Zeile zu lesen und dann aus dem std::string mit stringstream die Zahlen zu lesen.

    Du könntest auch zusätzlich immer zuerst die vier Werte lesen und dann diesen Zeilenvektor mit push_back an die Matrix anhängen, dann hast du nie unvollständige Zeilen.

    Btw, bei <fstream.h> ist das .h zuviel und wenn du statt char Arrays std::string nimmst, wird es viel robuster (einfach statt <string.h> <string> inkludieren und beim Vergleich direkt mit dem überladenene == Operator vergleichen)

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer
    Registriert seit
    05.07.2004
    Beiträge
    29
    vielen Dank skoa
    würdest mir bitte das c++_code schreiben(ich habe es versucht aber ), wie es mit string das einlesen geht und in einem vector gespeichert.

  4. #4
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Zum einlesen der Matrix
    Code:
        string line;
        std::vector<std::vector<int> > matrix;
    
        while(getline(inputstrom,line))
        {
            stringstream stream(line);
    
            int nr[4];
    
            if(stream >> nr[0] >> nr[1] >> nr[2] >> nr[3])
            {
                matrix.push_back(vector<int>(nr,nr + 4));
            }
        }
    (du brauchst dazu noch den Header 'sstream')

    Noch dazu möchte die Matrix am Ende complett mit:
    std::cout <<matrix[zeile][spalte];
    ausgeben das geht auch nicht!!
    Du mußt zum Ausgeben zwei verschachtelte for-Schleifen schreiben.

    Weiterhin ist ios::nocreate MSVC++ spezifisch, und du brauchst es auch nicht.

  5. #5
    Registrierter Benutzer
    Registriert seit
    05.07.2004
    Beiträge
    29
    Vielen Dank wraith dein code klappt wunderbar aber wenn ich jetzt mein Textdatei erweitere mit eine andere Tabelle . ich habe den code auch erweitert aber klappt es leider nicht.!!

    Dateiname : Tabelle 1.1
    Datum : 07.02.05
    korrektur : ja


    spannung
    mess1 mess2 mess3 mess3
    23 2 59 1
    56 63 7 1
    53 63 10 1
    Strom
    22 33
    47 25
    Code:
    string line;
        std::vector<std::vector<int> > matrix;
        std::vector<std::vector<int> > matrix2;
        while(getline(inputstrom,line))
        {
            stringstream stream(line);
    
            int nr[4];
    
            if(stream >> nr[0] >> nr[1] >> nr[2] >> nr[3])
            {
                matrix.push_back(vector<int>(nr,nr + 4));
            }
          int col[2];
    
            if(stream >> col[0] >> col[1] )   // !!!!diese Bed. wird nie durchgeführt 
            {
                matrix2.push_back(vector<int>(col,col + 2));
            }
            for(int RowNum = 0;RowNum < (matrix.size()); ++RowNum) 
    	  {
             // innere vector lesen
             for(int ColNum= 0; (ColNum < 4); ++ColNum)  
    		 {  
    			 
    	        cout <<setw(5)<<matrix[RowNum][ColNum]<< ' '; 
    		 } 
    	   std::cout << "\r\n"; 
    	  } 
    
          for(int Row = 0;Row < (matrix2.size()); ++Row) 
    	  {
             // innere vector lesen
             for(int nCol= 0; (nCol < 2); ++nCol)  
    		 {   
    	        cout <<matrix2[Row][nCol]<< ' '; 
    		 } 
    	   std::cout << "\r\n"; 
    	  }
    ich bedanke mich

  6. #6
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Warum die eine Bedingung fehlschlägt ist klar, weil im stream nur 4 Zahlen drin waren, die wurden vorher ausgelesen, der Stream erreicht eof-State, und ende.

    Das was du zusätzlich in die Datei eingefügt hast, liegt ja hinter deiner ersten 'Spannunug-Matrix'. Dh. du mußt erstmal diese einlesen, das machst ja bereits mit dem Ursprungscode, dann kommt irgend wann der String "Strom", und jetzt kannst du anfangen deine 'Strom-Matrix' einzulesen.

    Die Schleifen zum Ausgeben der Matrizen würde ich auch erst hinter die Einlese-Schleife schreiben, also wenn die Matrizen komplett eingelesen wurden.

  7. #7
    Registrierter Benutzer
    Registriert seit
    05.07.2004
    Beiträge
    29
    Zitat Zitat von wraith
    Warum die eine Bedingung fehlschlägt ist klar, weil im stream nur 4 Zahlen drin waren, die wurden vorher ausgelesen, der Stream erreicht eof-State, und ende..
    das stimmt nicht die 2. if-Bed liegt direkt nach der 1.if. das Auslesen der stromwerte erfolgt auch innerhalb der while-schleife(ich könte es beim debuggen sehen) d.h. vor eof-state.


    ..
    Die Schleifen zum Ausgeben der Matrizen würde ich auch erst hinter die Einlese-Schleife schreiben, also wenn die Matrizen komplett eingelesen wurden.
    du hast recht.ich habe mich einfach vertippt. ich hab es auch genauso wie du gesagt hast.

    danke sehr

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •