ifstream auslesen erste Zeile fehlt



  • Guten Abend,
    habe eine Problem mit meinem ifstream,
    beim auslesen fehlt die erste Zeile

    std::ifstream datei(infi);
    std::string text[100];
    int i;
    if( !datei )
    {
    	 throw "Fehler beim Öffnen!";
    }
    datei.seekg(0, std::ios::beg);
    while(!datei.eof())
    	{	
    
    	std::cout << "in der schleife ";
    	std::getline(datei,s);
    	for (i=0;i<10;i++)
    	{
    datei >> text[i] ;// Eine Zeile in die Variable text einlesen
    std::cout << text[i] << "\t\n" ;
    }
    
    }
    datei.close();
    

    beim auslesen bleibt die erste Zeile verschwunden aus der Datei ,
    aber sie steht in der der Datei , kann mir jemand sagen wieso ?
    oder sagen was ich ändern muss damit ich auch die erste Zeile bekomme ?

    gruß

    central



  • Was machst Du denn da? Lies bitte mal den passenden FAQ-Eintrag!

    Da das außerdem ein Standard-C++-Problem ist, verschiebe ich Dich mal.



  • Dieser Thread wurde von Moderator/in nman aus dem Forum Linux/Unix in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hallo,

    Was machst Du denn da? Lies bitte mal den passenden FAQ-Eintrag!

    ok also dann erkläre ich das mal

    std::cout << "in der schleife "; // ist um zu schauen ob ich in der schleife bin :)
    
    for (i=0;i<10;i++)
        {
    datei >> text[i] ;// Eine Variable in  mein Array text einlesen nach tabulator getrennt das heist nach jeder  Leerzeile eine Variable
    //  
    std::cout << text[i] << "\t\n" ; // zum testen die Variable ausgeben später hier nach Bedingung prüfen
    }
    

    soweit funktioniert das auch nur halt das ich die ersate Zeile nicht bekomme.
    Also würde ich mich freuen wenn mir jemand sagen könnte warum das so ist ?

    gruß

    central



  • central schrieb:

    Also würde ich mich freuen wenn mir jemand sagen könnte warum das so ist ?

    Da ist das getline zuviel 😉

    Lass mal auch das seekg weg. Das ist unnötig.
    Und denk daran das die über die Array grenzen geschrieben werden kann....



  • Dankeschön,
    Ich dachte ich brauche das getline um Zeilenweise zu lesen,
    aber das war wohl ein Irrtum.

    Das seekg hatte ich eingefügt nachdem ich ja nicht die erste Zeile bekam.

    Aber nun klappt das ja alles wie verrückt 🙂

    gruß

    central



  • Benutz das getline in der innter Schleife statt den >> .



  • Danke Freak_Coder,
    aber so wie es jetzt ist, klappt das ,
    wenn ich es mit getline versuche, bekomme ich als fehler das
    text[i] nicht als funktion verwendet werden kann .

    gruß

    central



  • Was willst du wo als Funktion verwenden?

    Richtig sieht der Aufruf so aus:

    std::getline(datei,text[i]);
    

    PS: getline() liest eine komplette Zeile, op>> liest nur bis zum nächsten Whitespace. Weitere Informationen findest du im Magazin

    PPS: Übrigens solltest du statt des Arrays einen vector<> oder deque<> verwenden - die können mitwachsen.



  • Wie wäre es denn mit:

    std::vector<std::string> text;
    
     {
       std::ifstream datei(infi); 
       if( !datei ) 
          throw std::runtime_error("Fehler beim Öffnen!");
    
       // Datei lesen
       std::string s;
       while(std::getline(datei,s))
          text.push_back(s);
    
       // Datei ausgeben
       for (std::vector<std::string>::const_iterator it = text.begin();
             it != text.end(); ++it) 
         std::cout << *it;
    
     } // close wird vom Destruktor erledigt
    


  • Guten Abend ,
    komme leider nur Nacht's zum arbeiten 🙂
    Also ich habe das jetzt so

    int ReadLddTxt( const char *infi)
    {
    std::ifstream datei(infi);
    std::string text[100]; // mehr als doppelt soviel wie ich brauche 
    int i;
    char * slash1;
    if( !datei )
    {
    	 throw "Fehler beim Öffnen!";
    }
    
    while(!datei.eof())
    	{	
    
          for (i=0;i<10;i++) // es stehen max 5 Variablen in eine Reihe aber man weiß ja nie
    	{
    datei >> text[i] ;// Eine Variable in text[i] einlesen
              if((slash1=strchr(text[i].c_str(),'/'))) //überprüfen auf /
              {
    std::cout << text[i] << "\t\n" ;
    Copy(((char *)text[i].c_str())); // Copy erwartet char
    }
    
    }
    
    }
    datei.close();
    
    return 0;
    
    }
    

    so klappt das wunderbar

    werde aber mal den code von tntnet probieren sieht schön sauber aus

    Besten Dank dafür

    gruß

    central


Anmelden zum Antworten