fwrite



  • Hallo, ich hab ein Problem mit dem abspeichern eines structs.
    Im Unterprogramm speichern habe ich es mit fwrite versucht, ich hab als ersten Parameter alles ausprobiert, aber es wurde nie das richtige in die Datei geschrieben.
    Auf diese Variante

    for(i=0;i<3;i++)
    {
        fwrite(&puffer[i],sizeof(char),1,datei_speichern);
        fprintf(datei_speichern,",");
        fwrite(&puffer[i],sizeof(int),1,datei_speichern);
        fprintf(datei_speichern,";");
    }
    

    wird C,CXVI;C,CXXV;C,CVXX in die Datei geschrieben.

    Wie krieg es hin, dass die Buchstabenfolge und die dezimalzahl in die Datei geschrieben wird?

    Wenn ich fprintf verwende funktioniert es. Aber es müsste doch auch mit fwrite machbar sein, oder nicht?

    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
    
    struct daten
    {
    	char roemisch[5];
    
    	int dezimal;
    };
    
    int speichern(struct daten *puffer)
    {
    
    	int i;
    
    	FILE *datei_speichern;
    
    	if((datei_speichern=fopen("datensaetze.txt","w"))!=NULL)
    	{
    	     for(i=0;i<3;i++)
    	     {
    	         fwrite(&puffer[i],sizeof(char),1,datei_speichern);
    		fprintf(datei_speichern,",");
    		fwrite(&puffer[i],sizeof(int),1,datei_speichern);
    		fprintf(datei_speichern,";");
    
    		printf("%s",puffer[i].roemisch);
    	         printf("%i",puffer[i].dezimal);
    	     } 
    
    	}
    	else
    	{
    		printf("Datei konnte nicht geöffnet werden");
    
    	}
    
    	fclose(datei_speichern);
    
    	return 0;
    
    }
    
    int main()
    {
    
    	struct daten datensaetze[3];
    
    	strcpy(datensaetze[0].roemisch,"CXVI");
    	datensaetze[0].dezimal=119;
    
    	strcpy(datensaetze[1].roemisch,"CXXV");
    	datensaetze[1].dezimal=103;
    
    	strcpy(datensaetze[2].roemisch,"CVXX");
    	datensaetze[2].dezimal=147;
    
             struct daten *zeiger;
    
    	zeiger=datensaetze;
    
             speichern(zeiger);
    
    	return 0;
    }
    


  • Wieso nimmst du nicht fprintf() - fprintf(datei,"%d,%s;",puffer[i].dezimal,puffer[i].roemisch);



  • Das hat funktioniert, aber mein Professor möchte, dass ich fwrite benutze.



  • Dann mußt du die richtigen Größenangaben und Positionen verwenden:

    fwrite(&(puffer[i].dezimal),sizeof(int),1,datei);//schreibe int-Wert (binär)
    fwrite(puffer[i].roemisch,5,1,datei);//schreibe String-Darstellung
    
    fwrite(puffer+i,sizeof(struct daten),1,datei);//schreibe komplettes Feld
    

    (nur am Rande: wenn du den int-Wert per fwrite schreibst, wirst du nichts menschen-lesbares herausbekommen)

    PS: Übrigens - C ist eine Etage höher 😉



  • Danke - das hat funktioniert.

    Wie kommt es denn, dass der Integer-Wert mit fwrite nicht lesbar in die Datei geschrieben wird?

    Man hat mir gesagt, dass fprintf in C++ nicht überall funktionieren würde.
    Worin besteht denn der Unterschied zwischen fprintf und fwrite?



  • fprintf schreibt einen String (Zeichenkette) in die Datei, fwrite schreibt die rohen Daten. D.h. integer Werte werden bei fprintf in einen String umgewandelt, bei fwrite eben nicht.



  • Danke - jetzt hab ichs verstanden.


Anmelden zum Antworten