nur jede zweite zeile wird gelesen...



  • bei folgender herangehensweise liest es nur jede zweite zeile aus.. was muss ich anders machen??

    #include blabla
    
    int main
    {
      File *g;
      g=fopen("c:\\test.txt","r");
      char line[20];
      do
      {
        fgets(line,sizeof(line),g);
      }while(fgets(line,sizeof(line),g) ==NULL);
      fclose(g);
    }
    


  • Probiers mal damit:

    #include <fstream>
    #include <iostream>
    
    using namespace std;
    
    void Lesen(char *Dateiname)
    {
    	ifstream Lese(Dateiname);
    	char Wort[255];
    
    	if(Lese)
    	{
    		while(!Lese.eof())
    		{
    			Lese.getline(Wort, 255);
    			cout << Wort << endl;
    		}
    	}
    
    	else
    	{
    		cout << "Datei nicht gefunden!" << endl;
    	}
    }
    
    int main()
    {
    	char Name[255];
    	cout << "Dateiname eingeben:" << endl;
    	cin.getline(Name, 255);
    
    	Lesen(Name);
    
    	return 0;
    }
    


  • Erstmal ist das C!

    Zu deinem Problem. Ist doch kar, du liest bei while eine neue Zeile ein. Ich kenne die Funktion leider nicht, aber die Zeile wird wohl in der Variable line gespeichert, wie es für mich aussieht, sollte ja ähnlich cin.getline sein. Naja, auf jedenfall muss der Befehl in deinem while-Konstrukt wie folgt aussehen:

    while{line == NULL}
    

    Eines Frage ich mich aber. Kann es sein das diese Funktion prüft wann das erste mal eine nicht leere zeile kommt? NULL steht doch dafür, wenn es keine Rückgabe gab oder???

    Code-Hacker



  • stimmt.. es müsst also heissen

    while(line!=NULL);
    

    doch nun hab ich das problem das er den != nicht frisst und mir ne endlosschleife gibt...



  • luiggi schrieb:

    bei folgender herangehensweise liest es nur jede zweite zeile aus.. was muss ich anders machen??

    Schau dir den geänderten Code an, wie Code-Hacker richtig sagte, du machst zweimal fgets und damit geht eine Zeile verloren.

    Da du hier C Code schreibst wärst du im ANSI-C Forum besser aufgehoben.
    Aber meine Korrektur ist ebenfalls in C

    #include blabla
    #define LEN 20
    int main
    {
      File *g;
      g=fopen("c:\\test.txt","r");
      char line[LEN+1];// das +1 ist eine Marotte von mir um den üblichen Fehler zu  
                      // vermeiden das für die schließende Null kein Platz mehr da ist.    
    
      while (NULL!=fgets(line,LEN,g) 
      {
    // ......   hier deinen Code
      };
      fclose(g);
    }
    

    PS: bsit du sicher das deine Daten nur 20 Zeichen lang sind?



  • Wie gesagt kann ich C nicht, weil ich C++ lerne. Doch er frisst ihn, ist nur komisch das er trotzdem weiter macht, warum kann ich dir allerdings nicht sagen, aber mach es doch so:

    while(line!=EOF);
    

    Jetzt sollte er bis zum Ende deines Files lesen.

    EDIT: Was mit eben aufgefallen ist und vllt. zum fehler beitragen kann ist das du sizeof(line) benutzt, da solltest du 19 angeben bzw. 20, wenn du vorher dein char mit 21 deklariert hast, um Fehler zu vermeiden. Ist mir heute erst passiert und das Ding hat am Rad gedreht.
    Du solltest vielleicht leiber so 250 nehmen pro Zeile, ich glaube das sollte dann auch reichen. Oder beliebig groß (sollte ich vllt. selbst mal machen....).

    Code-Hacker



  • eof geht nicht, da die funktion fgets NULL und nicht EOF zurückgibt



  • Mit dem while am Ende begehst du einen Fehler, du willst ja mit dem gelesenen String noch etwas anfangen
    Da du aber im EOF fall nochmal durch deine Bearbeitungsroutine gehst führt das zu fehlern, denn fgets ändert den Inhalt von line nicht wenn es einen Fehler findet die letzte Zeile wird also 2mal bearbeitet

    fgets liefert das eof nicht im string line zurück sondern als rückgabewert der Funktion. diesen must in einer int Variablen speichern und dann den vergleich damit machen.

    Der von die gewählte Vergleich geht auf ein Stringelement müßte somit syntacktisch zumindest so lauten
    while(line[0]!=EOF);

    Dus siehst die von dir gewählte lösung hat ein paar probleme.

    Schau dir mal den von mir geposteten Code an.

    Viel Spaß



  • der Haken ist nur das diese funktion keinen integer zurück gibt.. ich glaube ich

    hier nochmal der code

    do
    {
    fgets(line,sizeof(line),g);
    }while(line!=NULL);
    

    ich lese zuerst die zeile... dann check ich ob die zeile inhalt hat oder ob NULL zurückgegeben wurde..



  • @PAD:
    Jo, habe ich.

    Ich hatte dieses das EOF bei google gefunden, aber es wird dort anders benutzt wie ich nochmal gesehen habe.
    @luiggi:
    Musst einfach mal zu google gehen und "C" +"EOF" eingeben (natürlich mit "), da findest du einiges zum lesen von Files.

    Code-Hacker



  • fgets
    Get a string from a stream.
    char *fgets( char *string, int n, FILE *stream );
    Each of these functions returns string. NULL is returned to indicate an error or an end-of-file condition. Use feof or ferror to determine whether an error occurred.

    Der Vergleich while(line!=NULL); ist sinnlos

    Wenn dann zumindest so

    int err;
    do 
    { 
    err=fgets(line,sizeof(line),g); 
    }while(err!=NULL);
    

    Was willst du denn mit line machen, nachdem du sie gelesen hast?



  • nochmal zum mitmeiseln.. fgetc gibt einen integer zurück.. aber fgets nicht...

    ich will die line auf den inhalt checken.. quasi zeilenweise filtern...



  • Ich habe hier keine Zeit zu lesen was auf dem Bildschirm steht, scheint deine Devise zu sein

    Schau dir doch mal das posting vor deiner flame an.

    und wo willst du zeilenweise filtern?
    1 - nach dem fgets.
    2 - wenn fgets einen Fehler feststellt ist der returnwert 0 und der inhalt von line ungeändert
    3 - wenn Inhalt ungeändert und noch mal gefiltert wird diese Zeile nochmals ausgewertet
    4 - wenn die Abbruchbedingung der Schleife nicht stimmt, bricht die Schleife nicht ab
    5- wenn die Schleife nicht abbricht wird fgets ausgeführt und schon sind wir wieder bei 2



  • ich kann lesen und ich ich LESE auch.. habe auch alle vorgeschlagenen varianten gecheckt... problem ist erst steigt nicht aus abwohl er längst den wert 0 haben müsste..

    is auch egal😡



  • mach mal nach dem fgets ein simples

    printf("%s\n",line);
    

    damit du siehst was du gelesen hast.

    Ich hatte vorhin schon mal gesagt die 20 Zeichen kommen mir komisch vor.

    Was für eine Datei liest du und wie sieht die aus. Ist da wirklich jede Zeile 20 Zeichen lang oder sind die Zeilen vielleicht länger.??

    Wenn die Zeilen länger als 20 zeichen sind würde es genau zu diesem Effekt führen, denn fgets liest bis zu einem Newline oder maximal n (20) Zeichen. Beim nächsten lesen fängt es genau an der Stelle im File an an der es vorher das Lesen beendet hat

    Das diese Lösung nicht funktioniert würde mich wundern

    while (NULL!=fgets(line,LEN,g)  
      { 
    // ......   hier deinen Code 
      };
    

    Sie ist aus diesem Forum und auch länger diskutiert worden. Ich hab sie dann übernommen und in mehreren
    Projekten erfolgreich eingesetzt. Sie wir bei uns in der Firma als Template für File lesen benutzt.

    Viel Spaß



  • Wie gesagt, USE GOOGLE!
    Frage mich manchmal wieso man darauf eigentlich verweißt und es doch keiner nutzt? Vielleicht sollte man mal über dem Forum riesen groß google hinschreiben und schreiben wie man die beste Treffermöglichkeit bekommt, diese bekommt man in dem man wenig Suchbegriffe eingibt und in Anführungszeichen setzt, dazu bei mehr als einem Suchbegriff immer ein + vor jedem weitern Stichwort. Und...gibt es kein Beispiel in der ANSI C - FAQ? Würde mich irgendwie schon wundern. Hätte ich jetzt das Kylix3-Buch von einem Chef hier, dann könnte ich mal reingucken, weil dort das File-Handling in C++ auch mit dem C-File-Handling gemacht wird, wenn ich das recht in Erinnerung habe.

    Naja, ich würde sagen geh mal zu google...da wirste schon was finden!

    EDIT:
    @PAD:
    Sehe gerade du sagtest fgets liest an der stelle weiter wo es aufgehört hat, macht cin.getline dies auch?

    @luiggi:
    Guck mal hier:
    http://www.resourcecode.de/showtopic.php?threadid=1017
    http://www.c-plus-plus-archiv.de/forum/show.ca/message/6439/
    und ansonsten such selbst weiter, hier:
    http://www.google.de/search?q="C"+%2B"Datei+auslesen"&hl=de&lr=&ie=UTF-8&oe=UTF-8&start=0&sa=N

    Code-Hacker



  • @Code-Hacker passe, so firm bin ich in C++ leider noch nicht.

    Im übrigen verweise ich auf:
    http://www.c-plusplus.net/forum/viewtopic.php?p=361357



  • @PAD:
    Axso, dann google ich jetzt mal 😉
    Und wieso verweißt du auf den anderen Thread von luiggi? Willst du damit andeuten er soll warten bis ihm dort jemand die lösung posten kann?

    Habe eben nochmal meinen Beitrag editiert, da sind jetzt 3 Links drin, wenn die luiggi nicht weiterhelfen, dann weiß ich auch nicht weiter. Davon mal abgesehen das ich mir mittlerweile sowieso angewöhnt habe nicht mehr nach Codes zu fragen sondern selbst zu suchen, also mehr Ehrgeiz zu entwickeln, dabei lernt man oft noch dazu.

    Hier kannste auch nochmal gucken luiggi:
    http://www.google.de/search?hl=de&ie=UTF-8&oe=UTF-8&q="C"+%2B"EOF"&meta=

    Es gibt noch so viele Möglichkeiten nach denen du suchen könntest und ich könnte sie dir auch sagen, aber ein bißchen musst du schon selbst machen....

    Code-Hacker



  • @Code-Hacker der link war eher für dich gedacht, mit dem bezug auf meine allerletztes Posting in diesem Thread. In dem Posting ist die letzte Zeile von interesse.



  • Viele Wege führen nach Rom...

    ich hab ne supi lösung..

    fstream g;
    char line[1000];
    g.open("c:/test.txt",ios::in);
    while(!g.eof())
    {
      g.read(line,sizeof(line)-1);
      ....
    }
    

    Da stellt sich gleich die nächste Frage... 😃 😃 😃 😃 😃

    wie kann ich char line[1000] zwischendurch mal leeren???


Anmelden zum Antworten