C Textdatei zeilenweise lesen und werte(zahlen) in ein array speichern

ReVo

Lieutenant
Registriert
Jan. 2006
Beiträge
567
Hallo,

habe mich durch google geschlagen und sah, dass es tausende möglichkeiten gibt durch eine textdatei zeilenweise zu gehen. Ist auch eig. prima, leider klappten die sachen bei mir nicht richtig...zumindest nicht so wie ich das will. Also ich habe eine textdatei mit ganz vielen zahlen pro zeile, sogar minus zahlen mit ganz langen komma stellen. Ich muss alle werte in ein array speichern und dann die später verwenden. Aber das wird so nix, sobald ich testen will ob er alles richtig eingelesen hat kommt immer komplett was falschen raus. Immer nur 2-3 gleiche zahlen hintereinander... nicht so gut

PHP:
int main()
{

  double c[100];
  int i = 0;
  FILE *file;

  file = fopen("test.txt", "r"); 

  if(file==NULL) {
    printf("Datei konnte nicht geöffnet werden \n\n");
    return 1;
  }
  else {
    while(1) {
      c[i] = fgetc(file);
      if(c!=EOF) {
        printf("\n %lf \n", c[i]);
        i++;
      }
      else {
        break;
      }
    }

    fclose(file);
    system("\n\n\nPAUSE");	
    return 0;
  }

}

Man kann jetzt aus c einen char machen und dann bei printf anstatt %lf c einfach c ausgeben...dann sieht es schonmal viel besser aus! Leider stimmt das aber immer noch nicht! Irgendwie werden die zahlen nicht von oben nach unten ausgelesen und einige zahlen nach der komma stimmen nicht genau. Wie auch immer, ich brauche das nicht als char sondern als double, naja weil ich mit diesen werten später rechnen muss. Das geht dann als char garnicht richtig?

Irgendwelche tips?

Ich danke schonmal,
Gruß
 
benutze doch

Code:
void GetFileContent(char* FileName)
{
	//char filecont;
	FILE 	*file;
	int 	datalen 		= 100;	//buffer
	char 	data[datalen];			//charbuffer

	int 	i 				= 0;	//Rownum
	char 	*filecont;				//Actual Filecontent


	if((file = fopen(FileName, "r"))!=NULL)
	{
		if(file == NULL)
		{
			perror("FILE");
		}
		for(;
				(filecont = fgets(data, datalen,file))
				//(filecont = fgetc(file))!= EOF
				;i++
				)
		{
			//printf("ROW %i\n", i);
			int len = strlen(filecont);
                        /*
                        *DEIN CODE Zeilenweise FILE AUSLESEN
                        */
			filecont[len] = '\0';
		}
		//printf("Close File\n");
		fclose(file);
	}else{
		perror("IO ERROR");
		exit(EXIT_FAILURE);
	}
	return;
}

mit fgetc liest du nur einen character und kein string...

Ja einige sachen sind doppelt gemoppelt aber ist halt C, man weiss nie ob es wirklich funktioniert ;)
 
Zuletzt bearbeitet:
Hi

Ja stimmt, fgetc nur ein zeichen, es muss fgets(zeilenweise) sein. Aber nach deinem code funkt das so auch nicht. Bei der ausgabe kommen nur kryptische zeichen.
 
Ich bin mir nicht mehr ganz sicher ob ich noch genug C kenntnisse von damals habe aber ich versuchs trotzde mal mit einem kleinen Tip.

1. if(c!=EOF)
--> c ist bei dir ein Array aus double-Elementen. Ein Array verfügt meines erachtens über kein EOF, sonst wär Array ja File und nicht Array ;)

Demnach dürftest du garnicht mehr aus der Schleife "while (1)" herauskommen.
"i" würde immer inkrementiert werden und spätestens nach dem 101. fgetc dürftest du aus deinem Array fliegen und das Programm sich verabschieden

2. Überprüfe doch eher "file" auf EOF während du zeichen für zeichen einließt

3. Du sagst du hast kommastellen in den Zahlen, sind es Punkte oder Kommas? double und float kennt nämlich nur den punkt als Komma ;) Eine Konvertierung des Characters "," in ein float ergebe also kauderwelsch oder einen Fehler.

Vielleicht hilft das weiter. Muss mich selber mal wieder bissl damit beschäftigen, lang ists her :D
 
Hallo leute,

Also die nachkommastellen werden durch eine "." getrennt, nicht durch eine ","

ich denke die lösung lautet fscanf , zumindest nehme ich das mal stark an. Ich kriege damit auch die zahlen gut rein...aber immernoch nicht genau!

PHP:
long double c[100]

fscanf(file, "%Lf", &c[i]);

klappt prima, nur gibt er mir bei der ausgabe immernoch nicht alle nachkommastellen. Wenn eine zahl in der textdatei zb. 30.51515171 lautet, gibt er nur 30.515151 aus, also immer nur 6 stellen nach der komma, es sollten aber 8 stellen oder mehr nach der komma ausgegeben werden :/ - dachte zuerst dass es an der datentyp lag, hatte vorher double und dann hab eich long double versucht (ist ja größer), aber ändert nichts.

Nein beim testen gebe ich das auch mit %Lf (long double) aus, daran liegt das denke ich mal nicht. Jemand eine idee?

Gruß

Edit: leute... double und was auch immer, kann nur max 6 stellen nach der komma. Mehr geht nicht, das liegt nicht am fscanf oder sonstwas sondern am compiler oder dern typ, keine ahnung. Wie soll man mit eine 8+ stelligen nachkomma zahl rechnen, wenn man nur 6 nachkomma stellen einlesen/ausgeben kann?
 
Zuletzt bearbeitet:
ReVo schrieb:
Hi

Ja stimmt, fgetc nur ein zeichen, es muss fgets(zeilenweise) sein. Aber nach deinem code funkt das so auch nicht. Bei der ausgabe kommen nur kryptische zeichen.

also bei mir funktioniert alles prima... musst du halt entprechende bibliotheken includen. sonst debugge einfach mal...

kryptische zeichen bedeuten dass du auf die falsche speicherstelle zugreifst... musst du halt gucken wo deine vars den geltungsbereich verlassen.
 
Zuletzt bearbeitet:
Zurück
Oben