Text Datei Einzelne Werte einlesen und in Struktur speichern
-
Hallo
Ich versuche aus meiner Text Datei Werte auszulesen und diese in einer Struktur zu speichern.
Text Datei
[Netz] // Braucht nicht eingelesen werden * Haushalt // Braucht nicht eingelesen werden L 1 3 10.0 // L => Die Zeile wird eingelesen Wert "1" Speichen Wert "3" Speichern Wert "10.0" Speichern L 5 3 20.0 // L => Die Zeile wird eingelesen Wert "5" Speichen Wert "3" Speichern Wert "20.0" Speichern L 3 0 30.0 // L => Die Zeile wird eingelesen Wert "3" Speichen Wert "0" Speichern Wert "30.0" Speichern .END // Abschlussbedingung
Ich hab gelesen das man mit fgets auch Zeilenweise einlesen kann. Aber das macht doch auch kein sinn. Wie oben schon beschrieben möchte ich ja nur die Werte einlesen die nach dem "L" kommen.
ABER WIE!!!!
Ich schaff es die Werte Zeihenweise auszugeben aber nicht einzulesen geschweige denn zu speichern.
Ich hoffe auf Konstruktive Vorschläge und Anregungen.#include <stdio.h> struct abt { char stru_Text_Datei[100]; int stru_Wert_1[50]; int stru_Wert_2[50]; int stru_Wert_3[50]; }; int main(void) { int p=0; struct abt a[100]; FILE* Datei=fopen("/Users/../test.txt", "r"); if (Datei!=NULL) { printf("\nErfolgreich Datei Geöeffnet.\n"); while ((fscanf(Datei, "%s",a[p].stru_Text_Datei))!=EOF) { printf("\n %s ",a[p].stru_Text_Datei); } if (!fclose(Datei)) { printf("\nDatei geschlossen.\n"); } else printf("Fehler beim Schließen"); } return 0; }
Vielen Dank
-
Du laesst ein passendes sscanf auf die eingelesene Zeile los:
sscanf(zeiger_auf_zeile, "L %i %i %lf", &wert1, &wert2, &wert3);
Wobei du dann die passenden Formatspezifizierer fuer die Werte waehlst.
Oder besser: Anstatt erst die Zeilen einzulesen, liest du gleich alles passend mit (f)scanf ein. Der Formatstring ist sehr maechtig. Man kann selbst kompliziertere Formate sehr schoen damit zerlegen - auch solche, die auf einer Formatierung mittels Zeilenumbruechen basieren. Damit vermeidet man zwei Probleme mit der ersten Methode:
-Die erste Methode ist unnoetig umstaendlich
-Was passiert, wenn die Zeile zu lang ist?Ausserdem solltest du dir dringend nochmal ueberlegen, wie die Datenstrukturen in deinem Programm aussehen sollen. Derzeit scheint das noch sehr wirr zu sein, was ueberhaupt in dem
struct abt
gespeichert werden soll und auf welche Art und Weise.
-
Mhh ich hab versucht ihn so einzusetzen aber da liesst er nur Null Werte ein.
Wo liegt mein Denkfehler?while ((fscanf(Datei, "%s",a[p].stru_Text_Datei))!=EOF) { printf("\n %s ",a[p].stru_Text_Datei); fscanf(Datei, "L %i %i %f",a[p].stru_Wert_1,a[p].stru_Wert_2, &*(a[p].stru_Wert_3)); printf( "\n L %i %i %f",*a[p].stru_Wert_1,*a[p].stru_Wert_2,*a[p].stru_Wert_3); }
Und wie sollte ich die Struktur verändern?!
Ich habe auch anderen Text Dateien die etwas größer sind z.B.[Netz] // Braucht nicht eingelesen werden * Haushalt // Braucht nicht eingelesen werden L 1 3 10.0 // L => Die Zeile wird eingelesen Wert "1" Speichen Wert "3" Speichern Wert "10.0" Speichern L 5 3 20.0 // L => Die Zeile wird eingelesen Wert "5" Speichen Wert "3" Speichern Wert "20.0" Speichern L 3 0 30.0 // L => Die Zeile wird eingelesen Wert "3" Speichen Wert "0" Speichern Wert "30.0" Speichern L 3 0 30.0 // L => Die Zeile wird eingelesen Wert "3" Speichen Wert "0" Speichern Wert "30.0" Speichern L 3 0 30.0 // L => Die Zeile wird eingelesen Wert "3" Speichen Wert "0" Speichern Wert "30.0" Speichern L 3 0 30.0 // L => Die Zeile wird eingelesen Wert "3" Speichen Wert "0" Speichern Wert "30.0" Speichern L 3 0 30.0 // L => Die Zeile wird eingelesen Wert "3" Speichen Wert "0" Speichern Wert "30.0" Speichern L 3 0 30.0 // L => Die Zeile wird eingelesen Wert "3" Speichen Wert "0" Speichern Wert "30.0" Speichern .END // Abschlussbedingung
Da habe ich mir auch schon überlegt das ich die stru_Wert_1 flexibel machen muss.
-
Wie schon gesagt, deine Datentypen passen hinten und vorne nicht. Mach mal Compilerwarnungen an und beachte diese.
Das ist doch auch vom Design her schon hoechst verdaechtig:
Warum sind in einem struct apt die folgenden Dinge gleichzeitig untergebracht?
-Eine Zeile als Zeichenkette
-150(!) Integer
Und dann hast du 100 Exemplare von diesem struct. Das ist doch Murks!Weiterhin passen deine Formatstrings nicht. "%s" macht nicht das, was du denkst. Du gibst doch das Eingelesene aus. Da muss dir doch bereits aufgefallen sein, dass das nicht passt. Und der Rueckgabewert der scanf-Familie funktioniert ebenfalls ganz anders, als du es benutzt.
Du solltest dir dringend erst einmal angucken, wie scanf funktioniert. Versuch mal als allererste Uebung, die Datei zeilenweise einzulesen. Lass alles andere weg. Mach eine Ausgabe in der FormZeile X: <hier das was du gelesen hast>
fuer jede Zeile. Mit hochzaehlendem X und inklusive der "< >". Das Programm muss korrekt erkennen, wenn die Datei zu Ende ist und es darf weder eine Zeile fehlen, noch eine Zeile doppelt vorkommen (die letzte Zeile ist ein typischer Kandidat fuer faelschliche Doppelausgaben). Wenn du das hast, koennen wir mal weiter sehen und ueber Datenstrukturen sprechen.
-
Ich habe jetzt noch mal über alles drüber geschaut und den ganzen Mist rausgeworfen. Ich kann die Datei in einem Feld speichern und auch ausgeben aber ich weiss absolut nicht wie ich die Werte auslesen geschweige denn speichern kann.
L 1 3 10.0 // L => Die Zeile wird eingelesen Wert "1" Speichen Wert "3" Speichern Wert "10.0" Speichern
-
tante123 schrieb:
Ich kann die Datei in einem Feld speichern und auch ausgeben
Zeig doch mal.
-
FILE *datei = fopen ("/Users/Liste.txt", "r"); char text[100+1]; if (datei != NULL) { //Text Einlesen fscanf (datei, "%100c", text); //Text Ausgabe printf ("%s \n", text); fclose (datei); }
-
Ich graetsch hier mal rein.
#include <stdio.h> #include <locale.h> void skip_to_endl(FILE *f){ fscanf(f, "%*[^\n]\n"); } // eine Zeile: struct gadget{ int a, b; float c; }; void fprint_gadget(FILE* f, const struct gadget* g){ fprintf(f, "gadget(%d. %d, %f)\n", g->a, g->b, g->c); } int fscan_gadget(FILE* f, struct gadget* g, size_t n){ int read=0; while(n--){ if(fscanf(f, " %*[^0-9-]%d%d%f", &g->a, &g->b, &g->c)!=3){ puts("ouch!"); break; } // Kommentar ueberspringen skip_to_endl(f); ++read; ++g; } return read; } int main(){ setlocale(LC_NUMERIC, "de_DE"); // Dezimalzeichen ist ',' ("Komma") FILE* f=fopen("tante123", "r"); if(!f) return -1; struct gadget gs[3]; skip_to_endl(f); skip_to_endl(f); if(fscan_gadget(f, gs, 3)==3) for(int i=0; i<3; ++i) fprint_gadget(stdout, gs+i); }
Paedagogisch nicht wertvoll. Aber ich komm auch gerade aus der Kneipe.Und meine "Keine Hausaufgabe"-Barthaare haben gekitzelt.
Ich finde es eine Super Idee eine "L" Zeile in ein struct abzulegen - bisher sehe ich auch nix, was dagegen pricht.
-
tante123 schrieb:
FILE *datei = fopen ("/Users/Liste.txt", "r"); char text[100+1]; if (datei != NULL) { //Text Einlesen fscanf (datei, "%100c", text); //Text Ausgabe printf ("%s \n", text); fclose (datei); }
Einfach nur Nein. Haettest du das mal so gemacht, wie ich vorgeschlagen habe:
SeppJ schrieb:
Mach eine Ausgabe in der Form
Zeile X: <hier das was du gelesen hast>
fuer jede Zeile. Mit hochzaehlendem X und inklusive der "< >". Das Programm muss korrekt erkennen, wenn die Datei zu Ende ist und es darf weder eine Zeile fehlen, noch eine Zeile doppelt vorkommen (die letzte Zeile ist ein typischer Kandidat fuer faelschliche Doppelausgaben).
Dann haettest du gemerkt, dass das Unsinn ist. Ich mache mal fuer dich eine solche Ausgabe rein:
#include <stdio.h> int main() { FILE *file = fopen ("test.c", "r"); if (file != NULL) { int line = 0; char text[100+1]; while (fscanf (file, "%100c", text) == 1) printf ("Zeile %d: <%s>\n", ++line, text); } fclose (file); return 0; }
Wie du siehst, ist diese Leseaktion totaler Muell. Hast du dir seit Beginn des Threads wenigstens einmal angeguckt, wie die scanf-Familie funktioniert? Oder raetst du bloss herum, bis zufaellig etwas scheinbar funktionierendes heraus kommt?
-
Da du mit den Werten der Zahlen rechen möchtest, musst du auch die Zahlen einlesen.
Im Augenblick liest du nur Ziffern ein.
So wie Wörter aus Buchstaben bestehen, werden Zahlen mit Ziffern geschrieben. Dies ist aber eigentlich nur für den Menschen nötig.
Der Computer speichert Zahlenwerte anders ab.Du musst also die Ziffernfolge einlesen und in einer (passenden) Variablen speichern. Ein char oder char-Array ist nicht passend.
scanf bietet dafür dir richtigen Möglichkeiten. Du musst aber den richtigen Formatspecifier zum Variablentyp nehmen.Du hast in jeder Zeile drei Werte stehen. Diese kannst du in einer struct zusammen fassen.
Aber auch nur diese drei Werte. Und nicht 50 oder 100 oder 150.