ASCII bzw. Txt-Datei einlesen
-
Hallo Leute,
ich habe ein Problem und bräuchte dringend fachlichen Rat. Ich hoffe ihr könnt mir da helfen. Ich habe mit C leider keine großen Erfahrungen, bin jedoch plötzlich darauf angewiesen. Bin vorhin schon im falschen Forum gewesen, aber ich hoffe das ich hier jetzt richtig bin
Folgendes Problem:Ich möchte eine Text-Datei einlesen die folgendermaßen aufgebaut ist.
Datum Zeit Kraft Weg
Einheit Einheit Einheit Einheit
16.11.2009 10:12:44.235 1123 -45Das heist also, dass die ersten beiden Zeilen Text enthalten, den ich nicht brauche. Das Trennzeichen zwischen den Spalten ist der Tabulator.
Ich möchte jetzt die Daten einlesen, und zwar so, dass ich die Zahlen ("1123" und "-45") auch für spätere Berechnungen nutzen kann. Das Ergebnis der Berechnung würde ich dann gerne für jede Zeile in die gleiche Datei in ein neue Spalte schreiben wollen.
Das ganze kann von mir aus Zeilenweise geschehen oder in einer komplette Matrix. Da weis ich leider nicht was besser ist und was überhaupt geht.Ich hoffe ihr könnt mir helfen...bitte!!!
Vielen Dank schonmal!!!
Gruß
Maddin
-
Da bleibt dir wohl oder übel nichts anderes übrig, als die Zeile "von Hand" einzulesen. Sollte sogar relativ einfach sein, da du dich anhand der Whitespaces, Punkte und Doppelpunkte entlang hangeln kann.
EDIT:
Was du brauchst:
FILE, fread(), fseek()
-
Hm, soweit so gut! Die Datei öffnen klappt, aber kannst du mir das mit dem fseek und fread nochmal genauer erklären. Wie ist der Syntax aufgebaut. Ich quäle mich mit LCC-Win32 und ist die Hilfe nicht besonders Hilfreich
Also, über ein Beispeil wäre ich sehr dankbar.Gruß
Maddin
-
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
-
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 duc=="\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, **&**wegDein 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