abfragen von dateigrösse



  • hallo,
    ich wollte mit meinem programm solange etwas in eine datei schreiben, bis sie eine bestimmte grösse erreicht.

    problem: beim kompilieren endet das in einer endlosschleife und die datei wird immer grösser bis der explorer abstürzt weil die textdatei schon mehrere 100 mb gross ist.
    jedoch weiss ich nicht, warum die while-schleife nicht abbricht:

    # include <stdio.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <string.h>
    #include <sys/stat.h>
    #include <sys/types.h>
    
    int main(int argc, char *argv[])
    {
    
    	int fh;
    	char puffer[26];
    	strcpy(puffer,"abcdefghijklmnopqrstuvwxyz\n");
    	if (argv[1] == NULL)
    	{printf("Kein Argument uebergeben.\n");
    	printf("Geben Sie bitte den Namen der Zieldatei an.\n");}
    
    	else
    
    	fh =  open(argv[1],O_RDWR|O_CREAT, S_IRWXU);
    
    	while (sizeof("hallo.txt") < 2000)
    	{write(fh, &puffer,sizeof(puffer));}
    
    	return 0;
    }
    

    (in diesem fall wird mal angenommen, dass die übergebene datei wirklich "hallo.txt" heisst!)



  • Das geht mit man: stat(2).



  • hey! danke für die antwort, aber das hatte ich auch schon probiert und irgendwie wollte es genauso wenig 😞

    hier mein code mit stat:

    # include <stdio.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <string.h>
    #include <sys/stat.h>
    #include <sys/types.h>
    
    int main(int argc, char *argv[])
    {
    
    	int fh;
    	char puffer[26];
    	strcpy(puffer,"abcdefghijklmnopqrstuvwxyz\n");
    	if (argv[1] == NULL)
    	{printf("Kein Argument uebergeben.\n");
    	printf("Geben Sie bitte den Namen der Zieldatei an.\n");}
    
    	else
    
    	fh =  open(argv[1],O_RDWR|O_CREAT, S_IRWXU);
    
    	struct stat attribut;
    	stat(argv[1], &attribut);
    
    	while(attribut.st_size < 2000)
    	{write(fh, &puffer,sizeof(puffer));}
    
    	return 0;
    }
    

    beim aufruf hängt sich die shell auf und ich hab danach im ordner ne mehrere 100 mb grosse textdatei, die beim öffnen wiederum abstürzt.



  • Immer wenn du die Dateigröße überprüfen möchtest, musst du sie erst mit stat neu auslesen. attribut.st_size aktualisiert sich ja nicht von alleine.

    while(stat(argv[1], &attribut) == 0 && attribut.st_size < 2000)
    


  • ahh, vielen lieben dank, jetzt geht alles (musste nur noch die array-grösse verändern damit der zeilenumbruch auch noch reinpasst).

    aber mal eine frage, damit ich das auch ab jetzt verstehe:

    was genau heisst die zeile:

    stat(argv[1], &attribut) == 0
    

    was prüft er denn auf '0' ? bzw. stat gibt ja nen integer-wert zurück, soviel weiss ich schon. aber welche bedeutung hat die 0 als integer-wert bei der rückgabe von stat?

    danke.



  • In der oben verlinkten Manpage steht unter RETURN VALUES:

    Upon successful completion a value of 0 is returned. Otherwise, a value of -1 is returned and errno is set to indicate the error.

    Wenn stat also Null zurück gibt, ist alles in Ordnung. Wenn stat aber -1 zurück gibt, ist irgendein Fehler aufgetreten.



  • Vielen lieben Dank! 🙂



  • und mach ma bitte noch n

    close(fh);
    

    am ende hin, is schöner so, auch wenn eigentlich bei programmbeendigung alle ressourcen wieder ans os zurückgegeben werden, aber zur sicherheit alle file-deskriptoren wieder schließen.



  • hdi schrieb:

    problem: beim kompilieren endet das in einer endlosschleife und die datei wird immer grösser bis der explorer abstürzt weil die textdatei schon mehrere 100 mb gross ist.

    Wie kann der explorer abstürzen, wenn eine Datei immer grösser wird? Und das noch im Linux/Unix-Forum? 😕


Log in to reply