Dateimanipulation



  • Und was ist, wenn die Quelldatei leer ist? Versprochen, dass da irgendwann was hängen bleibt..

    Das ist eine Standard-Technik. Vorlesen, Schleifenverarbeitung, nachverarbeitung - letztere hat er nur vergessen..



  • wenn die datei leer ist, wird das vom feof() abgefangen.
    wenn noch kein feof() ist, wird eben gelesen und geschrieben und gut ist.
    bei ihm wird immer die letzte zeile vergessen.

    oh mein gott.
    es mag eine standardtechnik geben, die so funktioniert.
    hier ist die aber fehl am platz.
    es bleibt nichts hängen.
    mach doch mal einen test.

    wo hast du von dieser "standardtechnik" gehört?
    und wer hat dir gesagt, das würde in dem fall richtig sein?



  • Also das ist eine Standardtechnik, die du in jedem COBOL-, C-, PASCAL-, Assembler- und BASIC-Lehrgang lernst für den sich die Dozenten teuer bezahlen lassen. 3 Jahre Ausbildung in diesem Mist können mir ja nicht bei 4 verschiedenen Programmiersprachen was falsches beibringen, oder?

    Öffne doch mal eine leere Datei und lies dann einen datensatz binär aus. Wenn du dir dann deinen Speicherbereich anschaust, dann viel Spaß beim Bearbeiten von Versicherungsdaten, die dem Herrn Lwio2nya gehören..

    Schonmal aus einer Datei gelesen die leer ist?
    Das fopen sagt noch nichts darüber aus, ob die Datei am Ende ist. Erst das Auslesen erstellt das Kennzeichen...



  • ich tu mal so, als ob ich das nicht gelesen hätte...

    wozu ist dann das feof() da, wenn nicht, um nach nem dateiende zu gucken?

    der code da funktioniert problemlos, auch mit leeren dateien.
    fgets() verkraftet das.

    #include <stdio.h>
    
    #define BUFLEN 1000
    
    int main()
    {
    	FILE *f;
    	char buf[BUFLEN];
    
    	if ((f = fopen("r:\\foo.txt","r")))
    	{
    		while (!feof(f))
    		{
    			fgets(buf, BUFLEN, f);
    			printf("<<%s>>\n", buf);
    		}
    		fclose(f);
    	}
    	return 0;
    }
    

    außerdem, selbst wenn die datei leer wäre, beim ersten lesen selbst mit deiner tollen methode würde es einen fehler geben, den ein feof() vielleicht noch abgefangen hätte.

    und wenn du schon binär lesen willst, dann gibt ein fread() auch die menge der gelesenen daten zurück, mit der man arbeiten sollte (break aus dem loop, wenns zu wenig ist).



  • Also das ganze meint eigentlich folgendes:

    bei der sequenziellen Verarbeitung öffnest du eine Datei.
    Du bekommst einen Dateipointer. Das System hat keinerlei Informationen über den Inhalt der Datei.
    feof() selber (in Pascal, Assembler und COBOL ist es zumindest definitiv so, in C glaub ich aber auch) greift nicht auf die datei selber zu, sondern auf ein Kennzeichen im Speicher, welches Aussagt, ob beim letzten Lesen das Dateiende erreicht wurde oder nicht.
    Wenn du vorher nichts gelesen hast, ist dieses Kennzeichen undefiniert - default ist !EOF.



  • dann prüf ich eben den rückgabewert der leseoperation und verlasse bei nem fehler die schleife.
    ist noch lange kein grund, die schleife so breitzuziehen.





  • ist langsam nervig.. von hier aus kann ich mich nicht einloggen..

    Auf jeden Fall gehts mir darum: Ich sagte, es sei eine Standard-Technik.
    C kann natürlich auch ein

    while ( ( c = getc(F)) != EOF)
    {
    
    }
    

    Andere Sprachen schaffen dies allerdings nicht..
    Man spreche hier das heißgeliebte COBOL oder Assembler an.

    Grundlegende Technologien sollte man schon mal gelernt haben, auch wenn es bei einigen Sprachen bessere Lösungen gibt.

    Soo, mehr sag ich heute nicht mehr dazu - der Rechner hier nervt.. 👁



  • wenn überhaupt, dann so:

    while(fgets(zeile,MaxZeichen,fp_quelle))
      fprintf(fp_ziel,"%4d %s",++zeilennr,zeile);
    

    alles andere funktioniert nicht, falls die letzte zeile nicht mit new-line abgeschlossen sein sollte.



  • hmm.. und du meinst, sowas kann man mit nem zeichenweise Einlesen nicht herausfiltern? 😉


Anmelden zum Antworten