Datei Zeile für Zeile auslesen

Trendy Andy

Mitglied
Hallo,

Ich möchte eine Datei mit Gleitkommazahlen in jeder Zeile auslesen. Jedoch finde ich keinen geeigneten Befehl, um im die nächste Zeile der Datei zu springen und die nächste Zahl einzulesen. Kann mir da jemand helfen?

PS: Sorry wenn das schonmal gefragt wurde. Hab nix passendes in der Hilfe gefunden.
 
Du hast nix Passendes in der Hilfe gefunden? MSDN listet doch alle Funktionen zu diesem Thema feinsäuberlich auf, inklusive fgets(), was meine erste Assoziation zu diesem Thema wäre. Oder habe ich was falsch verstanden?

Code:
FILE *f = fopen( "test.txt", "r" ) ;
while( !feof( f ) )
{
  fgets( buffer, sizeof( buffer ), f ) ;
  // hier den String verarbeiten
}

Gawayn
 
Wie du an die nächste Zeile kommst, siehst du doch in meinem kleinen Beispielprogramm. fgets() liest eine Zeile ein. Somit befindet sich der Dateizeiger HINTER der soeben eingelesenen Zeile. Wenn du nun fgets() noch einmal aufrufst, wird die nächste Zeile eingelesen, und immer so weiter.

Gawayn
 
Ach so. Alles klar. Nur kommt dann gleich das nächste Problem.
fgets liest ja nen char ein. Nun müsste ich ja ne Typkonvertierung von char->float machen. Hast du dafür ne Lösung?
 
fgets() liest keinen char ein, sondern eine variable Anzahl von chars, also ein char[] (sprich: char-Array). Wieviele Zeichen von fgets() eingelesen werden, hängt einerseits vom count-Parameter ab (in meinem Beispiel das sizeof), und andererseits von der Länge der aktuellen Zeile in der Datei.

Wenn du mit fgets() eine Zeile in einen String eingelesen hast, musst du ihn zu einem float (oder einem double) konvertieren. (MERKE: Wir sprechen hier von Textdateien, denn nur in Textdateien macht fgets() Sinn. Bei Binärdateien wäre die Vorgehensweise eine andere.) Es gibt zwei Funktionen, die den Job für dich übernehmen: atof() und strtod().

Code:
double atof( const char *string ) ;
double strtod( const char *nptr, char **endptr ) ;

Wie diese beiden Funktionen arbeiten, müsste in deiner Hilfe stehen. Ansonsten bei Problemen: fragen.

Gawayn
 
Probier mal das aus:
Code:
#include <stdio.h>

int main(int arvc, char **argv)
{
	FILE *pf;
	float f = 0;

	pf = fopen("test.txt", "r");
	if(!pf) {
		printf("Konnte die Datei nicht öffnen\n");
		return 1;
	}

	while(!feof(pf)) {
		if(fscanf(pf, "%f", &f) == EOF) {
			break;
		} else {
			printf("%f\n", f);
		}
	}

	fclose(pf);
	getchar();
	return 0;
}
 
Irgendwie klappt beides nicht richtig. Bei fscanf liest er irgendwelche zahlen ein und bei der anderen möglichkeit kommt bei mir nen Fehler (kein Compilierfehler).

Ich poste einfach mal meinen Quelltext:
Code:
#include <stdlib.h>
#include <stdio.h>		

const int ARRAY_GR = 10;	//Konstante für die Größe des Feldes

FILE *stream;
char *string[10];

void readfile(double *x, int y)
{
	stream=fopen("minmax.txt","r");

	if(!stream)
		printf("Konnte die Datei nicht öffnen\n");

	while( !feof( stream ) )
	{
		for(int i=0;i<y;i++)			
		{	
			fscanf(stream, "%f", &x[i]);
			printf("%4.2f\n", x[i]);
			
			//fgets(*string, 8, stream ) ;
			//x[i] = atof(*string);
		}
		
	}
	fclose(stream);
}

double getmin(double *x, int y)
{
	double dummy =x[0];		
	for(int i=1;i<y;i++)	
		if(dummy>x[i])	
			dummy = x[i];
	return dummy;		
}

double getmid(double *x, int y)
{
	double sum=0;
	for(int i=0;i<y;i++)
		sum=sum+x[i];
	double mid=sum/y;
	return mid;
}

double getmax(double *x, int y)
{
	double dummy =x[0];		
	for(int i=1;i<y;i++)	
		if(dummy<x[i])
			dummy = x[i];
	return dummy;
}

void ausgabe(double *x, int y)
{
	printf("\nAusgabe des Feldes: \n");		
	for(int i=0;i<y;i++)
		printf("%4.2f\n",x[i]);
}

void main()
{
	double feld[ARRAY_GR];				
	readfile(&feld[0], ARRAY_GR);			
	printf("Minimum: %4.2f\n", getmin(&feld[0], ARRAY_GR));
	printf("Maximum: %4.2f\n", getmax(&feld[0], ARRAY_GR));
	printf("Mittelwert: %4.2f\n", getmid(&feld[0], ARRAY_GR));
	ausgabe(&feld[0], ARRAY_GR);					
}

Das Programm soll halt Zahlen einlesen und davon dann das Maximum, Minimum und Mittelwert ausgeben. Ihr müsst halt noch ne minmax.txt mit Gleitkommazahlen erstellen.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück