Zahlen (double) aus einer Textdatei in 2-dim array speichern

ania

Grünschnabel
Hallo,

eine so ähnliche Frage wurde in diesem Forum bestimmt schon mehrere Male gestellt, aber ich habe bisher nicht eine Antwort für genau mein Problem gefunden. Deshalb versuche ich mein Glück einfach nochmal und hoffe, dass ihr Verständniss dafür habt.

Ich habe eine Textdatei in der Zahlen drinstehen. Die Zahlen sind Dezimalzahlen mit mehreren Nachkommastellen, die positiv und negativ sein können (also vom Typ double Zahlen sind.) Es sind sechs Spalten in denen die Zahlen stehen, die durch ein LEERZEICHEN getrennt sind. Die Zeilenanzahl ist z.B. 4.
Hier ein kleines Beispiel für den Inhalt der Textdatei:

0.0001 0.000003 0.0001 2.4444 1.6654 7.003
0.005 3.4444 -1.493844 -0.0002 0.003 4.333
-0.7777 0.22 3.4444 0.0009 0.4444 1.4444
-1.493844 0.444 0.33 0.007 -3.555 6.444

Diese Werte möchte ich nun von der Textdatei namens B_data.txt einlesen und in ein double array [4][6] speichern, sodass ich später problemlos die einzelnen Elemente des Array abrufen kann. Ich habe einiges ausprobiert aber es geht einfach nicht und ich sitze schon seit längerem daran :(((((((((((

Mein C-Code sieht folgendermaßen aus:


PHP:
#include <stdio.h>

int main ()
{
int rows,columns,j,k;
FILE* fp;                                                             /* pointer to the txt file */
double gradB[4][6];
rows = 4;
columns = 6;

fp = fopen("B_data.txt","r");

for(j = 0; j < rows; j++)                                    /* Zeilen durchlaufen */
{
for(k = 0; k < columns; k++)                          /* Spalen durchlaufen */
{
fscanf(fp, "%lf", &gradB[j][k]);
}}

printf("%d\n",gradB[1][1]);                           /* hier möchte ich als Test ein Element der Matrix ausgegeben */

}


Hier ist eine weitere Variante, bei der ich auch kein Erfolg hatte:

PHP:
#include<stdio.h>
#include<stdlib.h>
int main()
 {
	
/* define variables */
	FILE *fp;	
	double B[4][6];
	int j=0,k=0;

/* Show error message when the file doesn't exist in the current directory */
	if((fp=fopen("B_data.txt","r"))== NULL)
	{
		printf("Cannot open file\n");
		exit(1);
}
	
	while(!feof(fp))
		{
			for(j=0;j<4;j++)
			{
                        for(k=0;k<6;k++)
			{
				fscanf(fp,"%lf",&(B[j][k]));
				printf("%f",B[j][k]);
			}
			printf("\n");
                      }  
		}
		fclose(fp);
}
Bei der zwiten Variante bekomme ich immer ein "Cannot open file" zu lesen. Ich weiß einfach nicht mehr weiter bzw. wo der Fehler liegt, da beide c-Codes sich fehlerfrei kompilieren lassen; nur das Ausführen geht immer voll in die Hose. Ich wäre wäre euch wirklich sehhhhhhr dankbar wenn ihr mir helfen könnt, mein Problem zu lösen.

Viele Grüße,
ania
 
Moin,

verstehe ich Dich richtig, das fopen klappt also in beiden Varianten nicht :confused::confused:

Dann mal ein Schuss ins Blaue :)
bist Du sicher, dass die genannte Datei in gleichen Verzeichnis wie Dein Programm liegt?
Ggf. würde ich mal versuchen den absoluten Pfad mit anzugeben, also sowas wie: "C:\\MeinVerzeichnis\\B_data.txt"

Gruß
Klaus
 
Vielleicht liegt es an der IDE arbeitest du? Zum Beispiel macht Code::Blocks ein Debug- und ein Release-Verzeichnis. Und dann findet eventuell dein Programm nicht die Textdatei.
 
Hi.

@ania: Du kannst dir übrigens eine Fehlermeldung mit perror ausgeben:
C:
if (fp == NULL) {
  perror("B_data.txt");
  ...
}
Gruß
 
Hallöchen alle,

also folgendes:

Mit diesem c- code:

PHP:
#include <stdio.h>

int main ()
{
int rows,columns,j,k;
FILE* fp;                             /* pointer to the txt file */
double gradB[4][6];
rows = 4;
columns = 6;

fp = fopen("B_data.txt","r");

for(j = 0; j < rows; j++)                          /* Zeilen durchlaufen */
{
for(k = 0; k < columns; k++)                          /* Spalen durchlaufen */
{
fscanf(fp, "%lf", &gradB[j][k]);
 printf("%f",gradB[j][k]);                /* show Matrix gradB */[
}}

 

printf("%f\n",gradB[2][5]);   /* hier moechte ich als Test ein Element der Matrix ausgegeben */

}


habe ich es geschafft, dass mir z.B. das richtige Element von gradB[2][5] angezeigt wird. Kleiner Hacken bei der Sache ist,
1. dass ich maximal nur sechs Stellen nach dem Komma angezeigt bekomme (ich habe zum Test ca. 8 Nachkommastellen gesetzt) . Was muss ich denn machen
um mehr angezeigt zu bekommen?

2. Wenn ich mir mal die Matrix gradB ansehen möchte bekomme ich in etwa sowas als Ausgabe :
0.0001000.0000030.0001002.4444001.6654007.0030000.0050003.444400-1.493844-0.0002000.0030004.333000-0.7777000.2200003.4444000.0009000.4444001.444444-1.4938440.4440000.3300000.007000-3.5550006.4440001.444444

Die Matrix gradB lasse ich mir durch den printf-Befehl ausgeben, direkt unter fscanf. Wo muss ich den das printf platzieren um eine "strukturierte" Matrix als Ausgabe zu bekommen?

Danke nochmal für eure Antworten. Das ist sehr nett von euch!

Viele Grüße,
ania
 
@ Vl freak,

also das Leseproblem an sich hat sich erledigt. Ich hatte es vor allem beim zweiten Problem. Davor hatte ich immer das Problem, dass zwar etwas eingelsen wurde, ich als Ausgabe irgeneine Adresse? oder ein Speicherzugriffsfehler oder sonst irgendeine Zahl (die nicht in meinem Array war) bekommen habe. Habe mehrere C-Codes ausprobiert, die zwei geposteten Codes sind die aktuellsten von mir.
Ich habe aber nach wie vor die zwei vorhin angesprochen Probleme.

Vg,
ania
 
Die Anzahl an Kommastellen kannst du festlegen indem du im Formatspezifizierer das entsprechend angibst:
C:
printf("%.08f", aFloat);

Dass du es in einer Matrixgestalt erhälst ist halt abhängig davon was du darunter verstehst, aber so grundsätzlich würde ich mal nach jeder Zeile ein \n ausgeben.
 
Hi,

wollt mich nur nochmal für eure Hilfe bedanken. Bis jetzt ;) klappt alles wie ich es will...juhu.

Viele Grüße,
ania
 
Zurück