Lesen aus einer Datei Spaltenweise in C



  • Hallo,

    ich hänge seit Tagen an einer Aufgabe fest, hoffe ihr könnt mir helfen.

    Und zwar soll ich aus folgender Textdatei Daten auslesen : ( Hier ein Auschnitt )

    0.015300 66.680000 67.400002 67.059998 66.940002
    0.035300 66.680000 67.519997 66.940002 66.940002

    und die Daten folgendermaßen ausgeben.

    5 0.015 66.68 67.40 67.05 66.94
    5 0.035 66.68 67.51 66.94 66.94

    Es wurden 2 Zeilen eingelesen.

    Die 5 in der ersten Spalte atellt die Anzahl der erfolgreich gelesen Werte da.

    Zum Anfang wäre ein Typ ganz gut wie ich die Zahlen Spaltenweise einlesen formatieren und ausgeben kann ?

    danke schon einmal 🙂



  • Zum einlesen scanf
    Beachte auch den Rückgabewert von scanf
    Zum Ausgeben printf



  • Was damit gemeint ist, ist, dass du hier erstmal Code anbieten sollst, bevor dir konkretere Hinweise gegeben werden.



  • Ja habe schon etwas probiert , hier mit fscanf und printf.

    Nur leider druckt er mir zwar 5 Spalten aber völlig falsche Zahlen und es gibt
    kein Ende 😞

    int main(void) {
    FILE *fp;

    int zeit;
    int v1, v2, h1, h2;

    fp = fopen("CanProbe.dat", "r");

    if (fp == 0)
    {
    printf("Datei kann nicht geoeffnet werden\n");
    return (-1);
    }

    while (fscanf(fp, " %7.6d %8.6d %8.6d %8.6d %8.6d\n", &zeit, &v1, &v2, &h1, &h2) != EOF)
    {

    printf(" %4.3d %4.2d %4.2d %4.2d %4.2d\n", zeit, v1, v2, h1, h2);
    }

    fclose(fp);
    return (0);
    }



  • Schau dir das mit den Formaten bei scanf und printf noch mal an 😉



  • Als was würdest du denn die Zahlen in der Datei einstufen: Ganzzahlen (Integer) oder Fließkommazahlen (double)?

    Und nimm bitte für den Code die cpp-Tags (Code markieren und auf den C/C++ Button unter den 🙂 😃 😉 klicken).



  • Vorschlag:

    #include <stdio.h>
    #include <string.h>
    
    int main(void)
    {
    	FILE* fp = fopen("CanProbe.dat", "r");
    
    	if (fp == 0)
    	{
    		printf("Datei kann nicht geoeffnet werden\n");
    		return -1;
    	}
    
    	char buffer[200];
    	char buffer1[200];
    	char* zeile = buffer;
    
    	int lines;
    	for (lines=0;fgets(zeile,200,fp);++lines)
    	{
    		char *pos;
    
    		strcpy (buffer1,buffer); // Kopie für strtok;
    
    		// Anzahl der Spalten ermitteln
    		int columns;
    		for (columns = 1,pos = zeile; (pos = strchr (pos,' ')); ++columns) ++pos;
    
    		/* 1. Möglichkeit: strchr */
    		printf ("strchr: %i ",columns);
    		char* z;
    		for (z = zeile; (pos = strchr (z,' '));z = pos+1)
    		{
    			if (pos) *pos = 0;
    			printf ("%.5s ",z);
    		}
    		printf ("%.5s\n",z);
    
    		/* 2. Möglichkeit: strtok */
    		printf ("strtok: %i ",columns);
    		char* token = strtok(buffer1, " ,\t\n");
    		while (NULL != token)
    		{
    			printf( "%.5s ", token );
    			token = strtok( NULL, " ,\t\n" );
    		}
    		puts ("\n");				// Zwei (!) Zeilenvorschübe
    	}
    
    	printf ("Es wurden %i Zeilen eingelesen\n",lines);
    
    	fclose(fp);
    	return 0;
    }
    

    viele grüße
    ralph



  • Danke für die Antworten , jetzt sollte es klappen 🙂


Anmelden zum Antworten