Dateigröße stimmt nicht mit Anzahl der Aufrufe von putc überein



  • Ich habe folgenden Code:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
    	FILE *file = fopen("Test.bin", "w");
    
    	int i;
    
    	for (i = 0; i < 10240; i++)
    		putc(rand() % 256, file);
    
    	fclose(file);
    
    	return 0;
    }
    

    Ich würde jetzt eigentlich erwarten, dass die ausgegebene Datei "Test.bin" genau 10240 Bytes groß ist, weil ich eben so oft durch die Schleife laufe und jedesmal einen Character, also 1 Byte, in die Datei schreibe.

    Dem ist aber nicht so. Stattdessen ist sie Datei 10276 Bytes groß. Selbst explizites Casten des Wertes nach unsigned char nützt nichts.

    Wenn ich statt rand() % 256 einfach 'a' schreibe, dann haut wieder alles hin und die Datei hat die erwartete Größe.

    Was ist hier los? Was muss ich anders machen, damit es hin haut?



  • In den Modi ohne b wird auf einigen Systemen (u.a. Windows) eine Umsetzung von \n nach \r\n gemacht. Da werden dann zwei Zeichen ausgegeben.

    Also statt "w" ein "wb" bei fopen. b wie binary. Dann stimmt auch die Datei-Extension 😉



  • Jup, daran lag's. Vielen Dank.



  • Kann man Windows den Quatsch eigentlich auch irgendwie abgewöhnen? Global oder wenigstens per-Prozess? Was passiert eigentlich, wenn ich "\r\n" schreibe? Verunstaltet Windows das dann auch zu "\r\r\n"?



  • kamelpeter schrieb:

    Kann man Windows den Quatsch eigentlich auch irgendwie abgewöhnen?

    Ja, indem du die Datei binär öffnest, also mit

    fopen("Test.bin", "wb");
    

    Andernfalls darf das Betriebssystem beliebig formatieren.


Anmelden zum Antworten