fwrite und fread/Hilfe bei Problemlösung



  • Hallo zusammen, ich benötige Hilfe von Cprogrammierern. Ich soll ein Programm schreiben in dem man Struckturen eingeben kann und dies sollen mit den Funktionen fread und fwrite in eine Datei gespeichert werden und von dieser auch wieder ausgelesen werden können. Mein Problemm ist nun das ich beim auslesen der datei zwar etwas von der funktion fread zurückbekomme, jedoch dann beim ausgeben nur 0en drin stehen. leider weis ich nicht was ich falsch mache. Bitte um Hilfe
    [code="c"]#include <stdio.h>
    #include <stdlib.h>
    #include "pointStack.h"

    void savePoint(POINT* points,FILE* STREAM);
    void loadPoint(POINT* points,FILE* STREAM);

    int main(void) {
    char fileName[31];
    FILE *STREAM=NULL;
    char command='x';
    POINT points[4];

    //Dateiname abfrage,Stream öffnen
    printf("Dateiname eingeben:");
    scanf(" %30s", fileName);
    STREAM=fopen(fileName,"a+b");
    if(STREAM==NULL){
    printf("Fehler beim Dateizugriff!\nProgramm wird beendet");
    return -1;
    }
    while(command!='q'){
    while(command!='q'&&command!='n'&&command!='l'){
    printf("Eingabe 'n' (neuer Punkt), 'l'(Datei lesen), 'q' (Programm beenden):");
    scanf(" %c",&command);
    //printf("DEBUG--------------------------------------------> %c",command);
    }//printf("DEBUG-----------------------------------------------> %c",command);
    switch(command){
    case 'n': //printf("n");
    savePoint(points,STREAM);
    command='x';
    break;
    case 'l': //printf("l");
    loadPoint(points,STREAM);
    //loadpoint rückgabe point array
    //printstackelement mit schleife durchgang rückgabe oben
    command='x';
    break;
    case 'q': printf("Das Programm wird beendet");
    fclose(STREAM);
    break;
    default: printf("Unbekannter Fehler, Programm wird beendet");
    fclose(STREAM);
    return -1;
    }

    }

    return 0;
    }
    void loadPoint(POINT* points,FILE* STREAM){
    unsigned int rCount=1;

    int i=0;
    printf("poistionszeiger: %d",ftell(STREAM));
    fseek(STREAM,0,SEEK_SET);
    printf("poistionszeiger: %d",ftell(STREAM));
    while(rCount > 0){
    rCount=fread(points,sizeof(POINT),4,STREAM);
    printf("rCount: %d\n",rCount);
    while(i<rCount){//i<4
    printStackElement(points[i]);
    i++;
    }
    }
    }

    void savePoint(POINT* points,FILE* STREAM){
    unsigned int wCount;
    POINT p=readPoint();
    wCount=fwrite(points,sizeof(POINT),1,STREAM);
    if(wCount!=1){
    printf("Fehler beim Schreiben");
    }printf("count: %d",wCount);
    }


  • Mod

    Gib mal die Definition von POINT an.

    Gib mal die Definition von readPoint und printStackElement an.

    Da fehlt der Header stdio.h für die ganzen Ausgabefunktionen.

    %d ist nicht der printf-Formatspezifizierer für long int.

    Du führst Vergleiche zwischen signed und unsigned Typen durch, was unter Umständen zu unerwarteten Ergebnissen führen kann.

    Deine Ausgabeschleife in loadPoint ist falsch. Nimm for, wenn du mit while nicht umgehen kannst.

    Deine Datei ist nur zum Anhängen geöffnet.

    Da sind bestimmt noch mehr Fehler drin, aber das sollte fürs Erste reichen.



  • @benschke, editiere bitte nochmals deinen Beitrag und füge unten noch [/code] hinzu, danke.

    P.S: @Sepp, als Mod kannst du das doch auch, oder?


  • Mod

    Th69 schrieb:

    P.S: @Sepp, als Mod kannst du das doch auch, oder?

    Ja, aber wenn der Threadersteller Qualitätsantworten möchte, dann kann er sich auch ein bisschen Mühe geben. Selbstständig nachträglich die fehlenden Schlusstags reinzueditieren gehört dazu.



  • Sorry ich war leider heute den ganzen Mittag kurzfristig verhindert.
    okay dann hier nochmal den Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include "pointStack.h"
    
    void savePoint(POINT* points,FILE* STREAM);
    void loadPoint(POINT* points,FILE* STREAM);
    
    int main(void) {
    	char fileName[31];
    	FILE *STREAM=NULL;
    	char command='x';
    	POINT points[4];
    
    	//Dateiname abfrage,Stream öffnen
    	printf("Dateiname eingeben:");
    	scanf(" %30s", fileName);
    	STREAM=fopen(fileName,"a+b");
    	if(STREAM==NULL){
    		printf("Fehler beim Dateizugriff!\nProgramm wird beendet");
    		return -1;
    	}
    	while(command!='q'){
    		while(command!='q'&&command!='n'&&command!='l'){
    			printf("Eingabe 'n' (neuer Punkt), 'l'(Datei lesen), 'q' (Programm beenden):");
    			scanf(" %c",&command);
    			//printf("DEBUG--------------------------------------------> %c",command);
    		}//printf("DEBUG-----------------------------------------------> %c",command);
    		switch(command){
    			case 'n':	//printf("n");
    						savePoint(points,STREAM);
    						command='x';
    						break;
    			case 'l':	//printf("l");
    						loadPoint(points,STREAM);
    						//loadpoint rückgabe point array
    						//printstackelement mit schleife durchgang rückgabe oben
    						command='x';
    						break;
    			case 'q':	printf("Das Programm wird beendet");
    						fclose(STREAM);
    						break;
    			default:	printf("Unbekannter Fehler, Programm wird beendet");
    						fclose(STREAM);					
    						return -1;
    		}
    
    	}
    
    	return 0;
    }
    void loadPoint(POINT* points,FILE* STREAM){
    	int rCount=1;
    
    	int i=0;
    		printf("poistionszeiger: %lld",ftell(STREAM));
    	fseek(STREAM,0,SEEK_SET);
    	printf("poistionszeiger: %d",ftell(STREAM));
    	while(rCount > 0){
    		rCount=fread(points,sizeof(POINT),4,STREAM);
    		printf("rCount: %d\n",rCount);
    		while(i<rCount){//i<4
    			printStackElement(points[i]);	
    			i++;
    		}
    	}
    }
    
    void savePoint(POINT* points,FILE* STREAM){
    	int wCount;
    	POINT p=readPoint();
    	wCount=fwrite(points,sizeof(POINT),1,STREAM);
    	if(wCount!=1){
    		printf("Fehler beim Schreiben");
    	}printf("count: %d",wCount);
    }
    

    und hier noch readPoint() und printStackelement()

    void printStackElement(POINT aPoint){
        printf("x=%6.2f  y=%6.2f  z=%6.2f\n",
               aPoint.x,
               aPoint.y,
               aPoint.z);
    }
    
    POINT readPoint(){
        POINT newPoint;
        printf("\nEingabe eines 3-Dimensionalen Punktes(X,Y,Z)\n");
    
        printf("X-Wert: ");
        scanf(" %f", &newPoint.x);
    
        printf("Y-Wert: ");
        scanf(" %f", &newPoint.y);
    
        printf("Z-Wert: ");
        scanf(" %f", &newPoint.z);
    
        return newPoint;
    }
    

    und noch die structur

    typedef struct point{
        float x;
        float y;
        float z;
    } POINT;
    


  • Ich denke, das Problem besteht darin, daß du auf einem geöffneten Stream gleichzeitig lesen und schreiben willst - und das funktioniert so nicht.

    Lösung:
    Deine beiden Funktionen loadPoint und savePoint sollten jeweils lokal die Datei öffnen und am Ende wieder schließen.



  • hab mein problem nun gefunden. Es lag an einem falschen Übergabeparameter der Funktion fwrite hier die alte savePoint():

    void savePoint(POINT* points,FILE* STREAM){
        int wCount;
        POINT p=readPoint();
        wCount=fwrite(points,sizeof(POINT),1,STREAM);
        if(wCount!=1){
            printf("Fehler beim Schreiben");
        }printf("count: %d",wCount);
    }
    

    und noch die neue:

    void savePoint(POINT* points,FILE* STREAM){
    	int wCount;
    	points[0]=readPoint();
    	wCount=fwrite(points,sizeof(POINT),1,STREAM);
    	if(wCount!=1){
    		printf("Fehler beim Schreiben");
    	}printf("count: %d",wCount);
    }
    

    habe in der alten einfach als erster Übergabeparameter nix sinnvolles drinstehen. Das "gleichzeitige" lesen und schreiben ermöglicht mir doch der modus "a+b". Das Programm funktioniert nun auf jeden fall richtig. Danke an alle,bin halt noch anfänger 😉


Anmelden zum Antworten