Matrix-Elemente einlesen



  • Hallo,

    ich habe eine Frage, wie ich am geschicktesten Matrix-Elemente aus einer Datei einlese. Der nachfolgende Code erzeugt eine Datei ausgabe.dat.
    Ich möchte die Elemente aus der Datei einlesen, ohne vorher durch den Benutzer die Dimension des Feldes festzulegen.

    Sprich: Es wäre toll, wenn die Funktion die notwendige Größe des Datenfeldes ermittelt und dann die Elemente entsprechend einließt.... Ich bin für jegliche Hilfe/Anregung dankbar.

    Danke.

    #include <stdio.h>
    #include <stdlib.h>
    
    void write2File(FILE *fPtr, double *matrix, int imax, int jmax) {
    	int i, j;
    
    	for (i=0; i<imax; i++) {
    		for (j=0; j<jmax; j++) {
    			fprintf(fPtr, "%.4lf\t", matrix[i*imax+j]);
    		}
    		fprintf(fPtr,"\n");
    	}
    }
    
    void main(void) {
    	int i, j;
    	int imax, jmax;
    
    	FILE *fPtr1;
    
    	printf("> Anzahl der Zeilen des Datenfeldes: ");
    	scanf("%d", &imax);
    	printf("> Anzahl der Spalten des Datenfeldes: ");
    	scanf("%d", &jmax);
    
    	double *matrix = (double*) malloc(sizeof(double)*imax*jmax);
    
    	printf("--------------------------------------------------\n");
    	printf("> Bitte geben Sie das Datenfeld ein....\n");
    	printf("--------------------------------------------------\n");
    
    	for (i=0; i<imax; i++) {
    		for (j=0; j<jmax; j++) {
    			printf("> Element [%d][%d]: ", i+1, j+1);
    			scanf("%lf", &matrix[i*imax+j]);
    		}
    	}
    
    	printf("--------------------------------------------------\n");
    
    	fPtr1 = fopen("ausgabe.dat", "w");	
    	if (fPtr1 != NULL) {
    		write2File(fPtr1, matrix, imax, jmax);
    		fclose(fPtr1);
    	} else {
    		printf("> ERROR: Konnte die Datei nicht zum Schreiben oeffnen...\n");
    	}
    
    	free(matrix);
    }
    


  • Wenn du das Dateiformat selbst definieren kannst, dann würde ich einfach die Dimensionen mit in die Datei schreiben, sinnvollerweise vor den Matrixelementen. Die kannst dann bequem auslesen und weisst genau wieviel Speicher du reservieren musst.



  • Ok,

    aber wie lese ich die Elemente einzeln ein? Sie sind durch \t getrennt...



  • Wenn du die Dimension nicht kennst dann musst du die Matrix dynamisch erweiterbar halten. Du liest einfach die Elemente ein (zB per fgets und strtok oder fgetc) und erweiterst die Matrix wenn du ploetzlich mehr Elemente hast als die Matrix fasst...



  • Ich habe nun versucht den Einlesevorgang mit strtok umzusetzen - es funktioniert aber nicht ganz. Die Wandlung des Strings in eine Zahl schlägt fehl. Was mache ich falsch?

    void getFromFile(FILE *fPtr, double *matrix,  int imax, int jmax) {
    	char buffer[512];
    	char *fStr;
    
    	int i=0;
    
    	do {
    		fgets(buffer, 512, fPtr);
    		fStr = strtok(buffer,"\t");
    
    		while ((fStr != NULL)  && (i < imax*jmax)) {
    			matrix[i] = atof(fStr);
    			fStr = strtok(NULL, "\t");
    			i++;
    		}
    	} while (!feof(fPtr));
    	// Auffüllen der verbleibenden Elemente
    	if (i < imax*jmax) {
    		for (i=i; i<imax*jmax; i++) {
    			matrix[i]=0;
    		}	
    	}
    }
    


  • Hallo,

    die Funktion getDatafromFile liest mittlerweile ganz erfolgreich ein Datenfeld aus einer Datei ein. Aber das Programm stürtzt trotzdem immer ab. Ich sehe den Fehler nicht...vielleicht hat jemand eine Idee.
    (P.S.: Das Programm läuft, wenn der Speicher bei Programmende nicht wieder freigegeben wird. free(matrix); im HP)
    Danke.

    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    #include <stdlib.h>
    
    #define TRUE 1
    #define FALSE 0
    
    void write2File(FILE *fPtr, double *matrix, int imax, int jmax) {
    	int i, j;
    
    	for (i=0; i<imax; i++) {
    		for (j=0; j<jmax; j++) {
    			fprintf(fPtr, "%4lf\t", matrix[i*imax+j]);
    		}
    		fprintf(fPtr,"\n");
    	}
    }
    
    void getDatafromFile(FILE *fPtr, double *matrix,  const int imax, const int jmax) {
    	char buffer[512];
    	char fChar;
    
    	int ckey;
    	int QUIT;
    	int i;
    	int j=0;
    
    	do {
    		i = 0;
    		// Inhalt von buffer löschen
    		strcpy(buffer, "");
    		// Einlesen von Einzelzeichen bis ein Leerzeichen, Zeilenumbruch oder Zeilenende erreicht wird.
    		QUIT = FALSE;
    		do {
    			fChar = fgetc(fPtr);
    			ckey = (int) fChar;
    			if ((ckey == 9) || (ckey == 10)) {
    				QUIT = TRUE;
    			} else {
    				buffer[i] = fChar;
    				buffer[i+1] = '\0';
    				i++;	
    			}
    		} while ((QUIT != TRUE) && (!feof(fPtr)));
    
    		if (strcmp(buffer,"") == 1) {
    			matrix[j] = atof(buffer);
    			j++;
    		}
    	} while ((!feof(fPtr)) || (j < imax*jmax));
    
    	// Auffüllen der verbleibenden Elemente
    	if (j < imax*jmax) {
    		for (j=j; j<imax*jmax; j++) {
    			matrix[j] = 0;
    		}	
    	}
    }
    
    void main(void) {
    	int ij;
    	int i, j;
    	int imax, jmax;
    
    	FILE *fPtr1, *fPtr2;
    
    	printf("> Anzahl der Zeilen des Datenfeldes: ");
    	scanf("%d", &imax);
    	printf("> Anzahl der Spalten des Datenfeldes: ");
    	scanf("%d", &jmax);
    
    	double *matrix = (double*) malloc(sizeof(double)*imax*jmax);
    
    	printf("--------------------------------------------------\n");
    	printf("> Bitte geben Sie das Datenfeld ein....\n");
    	printf("--------------------------------------------------\n");
    
    	for (i=0; i<imax; i++) {
    		for (j=0; j<jmax; j++) {
    			printf("> Element [%d][%d]: ", i+1, j+1);
    			scanf("%lf", &matrix[i*imax+j]);
    		}
    	}
    
    	printf("--------------------------------------------------\n");
    
    	// SCHREIBE IN DATEI
    
    	fPtr1 = fopen("ausgabe.dat", "w");	
    	if (fPtr1 != NULL) {
    		write2File(fPtr1, matrix, imax, jmax);
    		fclose(fPtr1);
    	} else {
    		printf("> ERROR: Konnte die Datei nicht zum Schreiben oeffnen...\n");
    	}
    
    	// LESE AUS DATEI
    
    	printf("--------------------------------------------------\n");
    	printf("Einlesen aus einer Datei.\n");
    	printf("--------------------------------------------------\n");
    
    	fPtr2 = fopen("ausgabe.dat", "r");	
    	if (fPtr1 != NULL) {
    		getDatafromFile(fPtr2, matrix, imax, jmax);
    		fclose(fPtr2);
    
    		for (i=0; i<imax; i++) {
    			for (j=0; j<jmax; j++) {
    				ij = i*jmax + j;
    				printf("> A[%d]=%.3lf\n", ij, matrix[ij]);
    			}
    		}	
    	} else {
    		printf("> ERROR: Konnte die Datei nicht zum Lesen oeffnen...\n");
    	}
    
    	free(matrix);
    }
    

Anmelden zum Antworten