Chunks lesen und \n ignorieren



  • Hallo,

    ich muss eine angegebene Größe an Zeichen lesen, z. B. 50 Zeichen pro Chunk. Erst dachte ich, dass ich mit fgets() ganz gut vorankomme, jedoch hört es bei einem \n auf zu lesen, was ich aber nicht möchte. Ich möchte, dass der Zeilenumbruch samt folgende Zeichen, bis ich die Chunksize erreicht habe, lese.

    Das Ziel: von Datei A nach Datei B kopieren mittels lesen.

    Ich habe auch noch fread() gefunden, dessen zweiter und dritter Parameter etwas seltsam sind. (Vermutlich verstehe ich den zweiten Parameter nicht so richtig.)

    Nun frage ich mich: ist fread() denn die richtige Funktion, oder gibt es da nicht sogar noch etwas besseres?

    Könnt ihr mir da weiter helfen?

    Danke!



  • Ach ja, hier mein Ansatz, der funktioniert, aber ich möchte gerne wissen, ob es nicht einen schöneren Weg gibt:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define CHUNKSIZE 20
    
    int main(void)
    {
    	FILE *f = fopen("test.txt", "r");
    	char *buffer = (char*) malloc(sizeof(char)*CHUNKSIZE);
    	int bytesRead = 0;
    
    	if(f == NULL) {
    		perror("Konnte Datei nicht öffnen");
    		exit(0);
    	}
    
    	while((bytesRead = fread(buffer, 1, CHUNKSIZE, f)) > 0) {
    		// Falls das Ende erreicht wurde, und der letzte Chunk kleiner
    		// als CHUNKSIZE ist, muss hinten ein Nullterminierungszeichen
    		// angehängt werden.
    		if(bytesRead != CHUNKSIZE) {
    			buffer[bytesRead] = 0;
    		}
    
    		printf("%i: '%s'\n", bytesRead, buffer);
    	}
    
    	free(buffer);
    	fclose(f);
    }
    

  • Mod

    fread passt schon.



  • Super, danke! 👍



  • Nur so nebenbei ... warum gibst du buffer bei f == NULL nicht frei?



  • Fake oder Echt schrieb:

    Nur so nebenbei ... warum gibst du buffer bei f == NULL nicht frei?

    Berechtigte Frage. 🙂 Ich habe es ehrlich gesagt vergessen. Aber das ist nicht tragisch, da das nur ein winziges Testprogramm ist, das ich als Teilproblem so getestet habe. Im vollständigen Code habe ich alles freigegeben.



  • Zeile 23 solltest du auch bei bytesRead == CHUNKSIZE machen.
    Bzw. sicherstellen, dass buffer[bytesRead] = 0; immer zutrifft, sonnst kannst du %s in Zeile 26 nicht nutzen.



  • DirkB schrieb:

    Zeile 23 solltest du auch bei bytesRead == CHUNKSIZE machen.
    Bzw. sicherstellen, dass buffer[bytesRead] = 0; immer zutrifft, sonnst kannst du %s in Zeile 26 nicht nutzen.

    Ja, stimmt hier wohl, das ist mir nicht aufgefallen. Im eigentlichen Problem ist das nicht wichtig, da dort die Dateien von Prozess A nach Prozess B übergeben werden und eine 1:1-Kopie der Datei erstellt werden soll. 🙂 Aber ich werde es im Hinterkopf behalten, für den Fall, dass ich es im Terminal ausgeben lasse!
    Danke für den Hinweis!


Anmelden zum Antworten