Dateiarbeit in C



  • Guten Tag, ich habe folgenden Programmausschnitt und dazu folgendes Problem:

    int speichern(char*, FILE*);
    void ausgabe(int);
    
    int speichern(char *text1, FILE *datei)
    {
    	int mem;
    	int anz;
    	mem=sizeof(text1);
    	printf("\nmem = %d",mem);
    	printf("\ntext: %s", text1);
    
    	anz=fwrite(text1,sizeof(text1),1,datei);				//  ;stream, in den geschrieben wird
    	return anz;												// anz = Rückgabewert von fwrite, ist gleich anzahl der erfolgreich geschriebenen Blöcke
    }
    
    void ausgabe(int anz)
    {
    	printf("\nes wurden %d zeichen abgespeichert.\n\n",anz);
    }
    
    void main()
    {
    	FILE *datei_text;													// Pointer vom Typ FILE Standartstruktur zur Dateiarbeit
    	int anz;
    	char text[]="Heute ist der 17. Juni und wir schreiben eine Klausur";	// string unbestimmter größe mit Inhalt "Heute.."
    	int mem;
    	mem=sizeof(text);			// Anzahl der Byte-Größe von text als integer in mem
    	printf("\nmem = %d",mem);	// Ausgabe der Anzahl der Bytes als dezimal Zahl
    
    	if((datei_text=fopen("text.txt","wb"))!=NULL)	
    	{
    		anz=speichern(text,datei_text);				// 
    		ausgabe(anz);
    	}
    	else
    
    printf("\nfehler beim oeffnen\n");
    }
    

    Mein Problem liegt hierbei im Unterprogramm speichern mit der Funktion fwrite (fwrite(text1,sizeof(text1),1,datei);. Sofern ich richtig verstanden habe, ist text1 hierbei die Anfangsadresse von meinem string. sizeof(text1) ist die Blöckgröße in Byte, die vorgibt, wie viel aufeinmal in den stream geschrieben wird, 1 die anzahl dieser Blöcke, die geschrieben werden und datei ist halt die Datei, in welche es geschrieben wird.
    Meiner Annahme nach müsste der Text, welcher in der main definiert wurde damit in die Datei geschrieben werden. text1 wurde soweit auch richtig übergeben, allerdings beträgt die Größe des Blockes, welcher geschrieben wird immer nur 4 Byte, womit immer nur Heut in die text.txt geschrieben wird, was ich mir allerdings nicht erklären kann.

    Grüße


  • Mod

    Welchen Typ hat text1? Zeiger auf char.
    Wie groß ist ein Zeiger auf char? Natürlich sizeof(Zeiger auf char).
    Worauf der Zeiger zeigt, ist dabei völlig ohne Belang.

    Man könnte die Größe eines nullterminierten Strings mittels strlen heraus bekommen. Das würde zu dem passen, was du hier mit deiner Funktion machst. Jedoch wäre es irgendwie sehr ungewöhnlich, nullterminierte C-Strings mittels fwrite zu schreiben. Also entweder ist fwrite hier falsch gewählt oder du machst komische Sachen mit deiner Funktion.

    Falls du denkst, dass fwrite richtig gewählt ist, dann ist strlen die falsche Funktion zur Grösenermittelung. In dem Fall mach es wie fwrite und lass dir die Größe an deine Funktion übergeben, fwrite macht das nicht umsonst gerade so.

    Falls du denkst, dass strlen richtig wäre, dann benutz zum Schreiben lieber so etwas wie fputs. Aber in dem Fall brauchst du auch kein strlen mehr, denn - oh Wunder - fputs kann schließlich selbst die Länge ermitteln, indem es intern eine ähnliche Operation wie strlen durchführt.

    Diese beiden Überlegungen führen zu der Erkenntnis, dass deine Schreibefunktion korrekterweise entweder so:

    int speichern(const void * ptr, size_t size, size_t count, FILE * stream)
    {
      return fwrite(ptr, size, count, stream);
    }
    

    oder so:

    int speichern(const char * str, FILE * stream)
    {
      return fputs(str, stream);
    }
    

    aussehen sollte. Was wiederum bedeutet, dass es vielleicht nicht sehr sinnvoll ist, überhaupt diese Speicherfunktion zu schreiben, da sie keinerlei Mehrwert gegenüber dem Original hat.



  • Ist verständlich, daran hatte ich nicht gedacht. Danke
    Es ging hier lediglich um das Verständnis.
    Man sollte erklären können, wie das Programm arbeitet.


Log in to reply