textdatei



  • hallo
    ich braüchte Ihre Hilfe dringend!
    ich habe ein programm mit VC++6.0 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

    #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 😡

    Hilfe!!!
    danke schön



  • Weil die Datei nach der 1 nicht zu Ende ist?

    Bye, TGGC (Pipe my World.)



  • wie denn? es gibt nichts danach außer leerzeichen



  • kobero schrieb:

    matrix[zeile].resize(4);

    Schreibe lieber:

    matrix[zeile].resize(vectorSize);
    

    auf http://www.cppreference.com/cppvector/resize.html steht:

    void resize( size_type num, const TYPE& val = TYPE() );
    

    Schaue lieber mal ab und zu dort nach 😉

    MFG Ghost



  • kobero schrieb:

    es gibt nichts danach

    Ach wirklich?

    kobero schrieb:

    außer leerzeichen

    Ah so.

    Bye, TGGC (Pipe my World.)



  • Leerzeichen gibt es dahinter nun auch nicht. Dies würde ja unnötig Speicher verbrauchen... Auch Leerzeichen brauchen Platz.



  • Green_Ghost schrieb:

    matrix[zeile].resize(vectorSize);
    

    wo liegt der Unterschied? Da http://www.cppreference.com/cppvector/resize.html habe ich nichts kapiert(my english is very bad)

    henselstep schrieb:

    Leerzeichen gibt es dahinter nun auch nicht. Dies würde ja unnötig Speicher verbrauchen... Auch Leerzeichen brauchen Platz.
    

    wie soll ich denn das vermeiden
    ich möchte einfach das Null am Ende weg haben

    Danke für jeden tip



  • Hab deinen Quelltext jetzt nicht durchgelesen, kann dir aber sagen, dass bei schleifen folgender Art:

    while (!blabla.eof()) {
    }
    

    Die schleife immer einmal zu viel ausgeführt wird.

    mit einem matrix.pop_back() kannst du dann das letzte Element wieder löschen.



  • da kommt deine NULL her:

    return 0;
    

    und hier hättest du eine weitere '1' am ende:

    return 1;
    

    abhilfe:

    statt

    int lesen()
    

    machst du das was die funktion wirklich zurückgibt, nämlich nichts:

    void lesen()
    ...
    //return 0; <- brauchst du ja jetzt nicht mehr
    

    //edit: üblige schreibfehler entfernt



  • Uh...der Rückgabewert von "lesen" wird nie ausgegeben, also bezweifle ich, dass er mit irgendetwas etwas zu tun hat.

    Ich denke (ohne es jetzt getestet zu haben), dass in diesem Fall schon

    for(spalte= 0;
        (spalte < vectorSize) && (inputstrom >> matrix[zeile][spalte]);
         ++spalte) {
        std::cout <<matrix[zeile][spalte]<< ' ';
    }
    

    reicht. inputstrom >> matrix[zeile][spalte] liest nämlich nicht nur den Wert ein, sondern gibt auch den Stream zurück. Das heißt, sobald die Einleseoperation fehlschlägt, bricht die Schleife ab, weil der Stream sein failbit gesetzt hat und bei Umwandlung in bool false zurückgibt.



  • Hallo
    Erst mal vielen Dank für eure Ideen.
    Für Gast221212: vielleicht hast du recht aber wo (in welcher stelle) kann man die „ matrix.pop_back()“ einsetzen?

    Für enno-tyrant : 0xdeadbeef hat völlig recht , der Rückgabewert von einer Funktion wird nie automatisch ausgegeben. Trotzdem habe ich deinen Vorschlag probiert, die Null wird immer noch ausgegeben.

    Für 0xdeadbeef : es hab es probiert : es werden nur die 2. und 4. Spalte ausgegeben.
    Aber die Idee ist nicht schlecht. Genau dort in der for-schleife muss man was unternehmen.

    Danke für jeden weiteren Tip



  • kobero schrieb:

    Hallo
    Erst mal vielen Dank für eure Ideen.
    Für Gast221212: vielleicht hast du recht aber wo (in welcher stelle) kann man die „ matrix.pop_back()“ einsetzen?

    nach

    }while(!inputstrom.eof());
    

    Du musst dir jedoch selbst überlegen, welchen vector du poppen willst also ob:
    matrix.pop... oder matrix[ner_positon].pop...

    und dann noch ne Schleife für die Ausgabe schreiben!


Anmelden zum Antworten