ASCII bzw. Txt-Datei einlesen



  • Wenn du sicherstellen kannst, das die Zeilen in der Textdatei eine bestimmte Länge nicht überschreiten, dann bietet sich zum Einlesen der Zeilen in ein char Array die Funktion fgets an. Das wäre das Einfachste.
    Bei der dritten Zeile kannst du die Werte mit sscanf aus dem Array in Variablen einlesen.

    Gruß,
    B.B.



  • Das kann ich leider nicht. Ich würde es halt schon gerne Zeilenweise machen. Und wie schon gesagt brauch ich halt die ersten beiden Zeilen nicht und die ersten beiden Spalten brauche ich eigentlich auch nicht.



  • Die Zeilen einer Textdatei sind mit dem '\n' Zeichen abgeschlossen, diese kannst du mit fgetc einlesen und dein Programm zählen lassen.
    Bei n = 2 zählst du dann die Leerzeichen, wieder bei n = 2 steht dein Dateizeiger unmittelbar vor dem ersten Integer Wert, den du möchtest.
    Dann schwupp scanf und beide Werte sind eingelesen.



  • entschuldige bitte, aber ich komme da gerade überhaupt nicht mit 😞
    Wie am Anfang erwähnt bin ich ein ziemlicher Leihe mit einem einer ziemlichen schlechten Hilfe auf Englisch in meinem Compiler. Ein kleiner Codeausschnitt wie man fgetc anwendet wäre sehr hilfreich.
    DANKE!

    Gruß
    Maddin



  • Guckst du:

    #include <stdio.h>
    
    int main() 
    { 
    	char* filename = "test.txt";
    	int c = 0, n = 0;
    	FILE* fp = fopen ( filename, "r" );
    
    	if ( fp == NULL )
    	{
    		printf ( "Die Datei %s konnte nicht geoffnet werden.\n", filename );
    		return 0;
    	}
    
    	while ( (c = fgetc ( fp )) != EOF )
    	{
    		putchar(c);
    		if ( c == '\n' )
    		{
    			n++;
    			printf ( "Die %d Zeile wurde eingelesen, zum Fortfahren "
    						"bitte Enter druecken.", n );
    			getchar();
    		}
    	}
    
    	fclose (fp);
    	return 0;
    }
    


  • Jo Danke!!! Leider kommt bei "if (c=='\n')" folgende Fehlermeldung
    "operands of == have illegal types 'char' and 'pointer to char' "

    Gruß
    Maddin


  • Mod

    MS@GL schrieb:

    Jo Danke!!! Leider kommt bei "if (c=='\n')" folgende Fehlermeldung
    "operands of == have illegal types 'char' and 'pointer to char' "

    😕
    Hast du das Programm von Hand abgetippt? Dein Fehler klingt danach, als hättest du

    c=="\n"
    

    geschrieben, anstatt:

    c=='\n'
    

    In dem Code von Big Brother ist das aber richtig...



  • Hallo,
    ich habe das natürlich kopiert. Ich kann mir das auch nicht erklären. Ich hatte schon beide Version ausprobier.
    Woran kann es denn sonst noch liegen???
    Bitte, ich brauch dringend hilfe!!!

    Danke aber trotzdem schonmal!
    Gruß
    Maddin



  • Hallo,

    noch mal das ganze Programm zeigen, mit Fehlermeldung, in welcher Zeile usw...oder was sonst nicht geht, wenn kein Fehler...

    MfG,

    Probe-Nutzer



  • Hallo,

    ich habe mittlerweile eine andere Lösung gefunden. Aber ein Problem gib es immer noch mit dem einlesen.
    Ich lese die Datei jetzt Zeilen weise mit einer while-Schleife und fscanf ein.

    char datum[10], zeit[12];
    float kraft, weg;
    FILE *fp;
    fp=fopen("Data1.txt","r");
    while (fscanf(fp,"%s %s %f %f",datum, zeit, kraft, weg)!=EOF)
    

    Dabei tauch jetzt folgendes Problem auf. Das Datum wird zusammen mit der Zeit eingelesen. "26.10.200914:56:44.312"
    Die Zeit, die Kraft und der Weg jedoch einzeln so wie es sein soll.
    In der Datei sind die Spalten alle durch Tabulator getrennt.
    Ich kann mir das nich erklären.
    Ich wäre auch zufrieden, wenn man die Zeit einfach abschneiden könnte und das dann nur das Datum in der Variablen übrig bleibt.
    Vielleich habt ihr ja ne Idee?!

    Danke schonmal!!!
    Gruß
    Maddin



  • Bei dir fehlen die Adressoperatoren im scanf Aufruf.
    Muss heißen: fscanf(fp,"%s %s %f %f",datum, zeit, **&**kraft, **&**weg

    Dein Programm könnte tatsächlich so funktionieren, aber nur wenn die Anzahl der verworfenen Strings durch die Anzahl der %s im Formatstring Teilbar ist ( hier 2 ).
    Ansonsten gibts Datensalat, z.B. wird dann ein Teil des Datums in der Kraft gespeichert usw! Deine char Puffer sind zu klein für Stringfunktionen!

    Wenn du jetzt doch konstante Arrays nimmst, mach es lieber ca. co:

    char buf[1024] = {0},  datum[64] = {0}, zeit[64] = {0}; 
    	float kraft = 0.0, weg = 0.0; 
    
    	while ( fgets ( buf, sizeof(buf), fp )) // erste zeile überspringen
    	{
    		if ( NULL == ( fgets ( buf, sizeof(buf), fp )) // zweite zeile überspringen
    			break;
    		if ( 4 != fscanf ( fp, "%s %s %f %f", datum, zeit, &kraft, &weg ))
    		{
    			puts("lost!");
                fcloseall();
    			exit(-134);
    		}
    		printf ("Kraft: %f Weg: %f\n", kraft, weg );
    	}
    


  • Hallo Big Brother,

    hab vielen Dank für deine Hilfe. Leider habe ich ne ungerade Anzahl an Strings so dass es leider den von dir beschriebenen Datensalat gibt. Aber du hast mir trotzdem sehr geholfen. Der Tipp mit dem char-Puffer war genau richtig!!! Die Korrektur bei fscanf sowieso. Ich hab jetzt wahrscheinlich nicht die eleganteste Lösung, aber es klappt immerhin so wie wollte!!!
    Also nochmal vielen Dank!!!

    Gruß
    Maddin


Anmelden zum Antworten