Liste aus Text-Datei einlesen und als Variable speichern
-
So ein Müll habe ich lange nicht gesehen.
Wrapper musst du so oder so schreiben, wenn du willst, dass das auf mehreren Systemen läuft.
Wrapper musst du gar nicht schreiben, wenn du ausschließlich Funktionen des C-Sprachstandards benutzt.
Als Anfänger (von dem ich ausgehe, dass du einer bist) interessiert dich aber eh nur, das erst mal lauffähig zu bekommen.
Ahnungslose Anfänger gibt es immer wieder, die meinen, andere Anfänger mit ihren 'Erfahrungen' beglücken zu müssen.
-
Vielleicht hätte ich deutlicher machen sollen, dass das erste "so" sich auf Systeme bezog, die tatsächlich keine Laufzeitbibliothek besitzen, sondern nur ein rudimentäres API - selten, aber ich habe bereits schon so etwas gesehen - und das zweite "so" sich auf den unheimlichen Murks, den die C-Laufzeitbibliothek darstellt.
scanf hängt sich in einer Endlossschleife auf? Ach, das erklären wir zum Feature, nicht zum Bug. Du willst die Länge einer Datei herausfinden?fopen
, dannfseek
,ftell
und dann wiederfseek
. Das ist nicht deren Ernst, oder?Wrapper sollte man dann schreiben, wenn man über diese kaputten Schnittstellen nicht arbeiten will - also fast immer.
Wutz schrieb:
So ein Müll habe ich lange nicht gesehen.
Du meinst, die gleiche Kategorie Müll wie "verkettete Listen sind scheiße"? Aber dazu willst du dann lieber doch nichts sagen, hm?
-
Wutz schrieb:
So ein Müll habe ich lange nicht gesehen.
Das sehe ich ganz genauso.
Und erst dieser scheiß Code mit zig Verrenkungen.
Das geht einfacher und eleganter.@TS
bitte lerne von dachschaden nichts.re342 schrieb:
Dazu hatte ich die Idee ein Strukt für Vor- und Nachname zu erstellen, darüber ein Array zu erstellen
so weit so gut.
und mit einer for-Schleife nach und nach die Vor- und Nachnamen jeweils in ein weiteres Struct-Element zu packen. Diese füge ich dann sortiert in eine zunächst leere Liste ein.
Würde ich nicht machen. Wozu die vielen Kopierschritte in neue Structs?
Stattdessen machst du besser ein Array von Zeigern, dass auf deine Structobjekte zeigt und tauschst dann nur die Zeiger im Array aus.
Das geht schneller.Meine Frage : Wie bekomme ich die Daten aus der Textdatei in die Struct-Elemente hinein?
Zeilenweise einlesen, parsen und dann entsprechend reinkopieren.
Guck dir dazu die Standard C Dateifunktionen an.Als Rahmen habe ich bisher folgendes :
[code="c"]
name Person[100]; // Anzahl Zeilen der Datei
[/QUOTE]
Globale Variablen sind pfui.
Versuch es ohne, es geht immer ohne globale Variablen, man muss nur wollen.Und lässt sich die Anzahl der Zeilen der Textdatei auch ermitteln?
Gruß
Du könntest die Anzahl der Zeilen natürlich vorher erst einmal durchzählen, eleganter wäre es aber, wenn deine Arraygröße dynamisch angelegt wird und bei Bedarf einfach mehr Speicher reserviert wird.
In so einem Fall empfiehlt es sich auch eine Liste zu nehmen, die dynamisch wachsen kann.
-
Rambermann schrieb:
Du könntest die Anzahl der Zeilen natürlich vorher erst einmal durchzählen, eleganter wäre es aber, wenn deine Arraygröße dynamisch angelegt wird und bei Bedarf einfach mehr Speicher reserviert wird.
In so einem Fall empfiehlt es sich auch eine Liste zu nehmen, die dynamisch wachsen kann.Den relevanten Hinweis habe ich vergessen.
Mit einer dynamischen Liste kannst du gleich mit dem Einlesen der Daten anfangen und wenn deine Liste zu klein ist, machst du sie einfach größer.
D.h. vorher Zeilen lesen musst du nicht.Damit das aber einigermaßen performant läuft, solltest du den Speicher Blockweise anfordern.
Also gleich mal für mehrere mögliche Zeilen und nicht nur bei jeder einzelne Zeile.
-
Rambermann schrieb:
Du könntest die Anzahl der Zeilen natürlich vorher erst einmal durchzählen, eleganter wäre es aber, wenn deine Arraygröße dynamisch angelegt wird und bei Bedarf einfach mehr Speicher reserviert wird.
In so einem Fall empfiehlt es sich auch eine Liste zu nehmen, die dynamisch wachsen kann.Rambermann schrieb:
Das sehe ich ganz genauso.
Und erst dieser scheiß Code mit zig Verrenkungen.
Das geht einfacher und eleganter.Es ist also intelligenter, einfach ein Array dynamisch wachsen zu lassen? Hast du mal gemessen, wie teuer so ein
realloc
/malloc
ist? Und das soll elegant sein? Ich lach mich tot.Ich halte mich da raus. Weniger Konkurrenzdruck für mich.
-
dachschaden schrieb:
Es ist also intelligenter, einfach ein Array dynamisch wachsen zu lassen? Hast du mal gemessen, wie teuer so ein
realloc
/malloc
ist? Und das soll elegant sein? Ich lach mich tot.Deswegen macht man das Blockweise, wie ich bereits schrieb.
Tot lachen kannst du dich gerne, dann haben wir zukünftig einen weniger hier, der Stuss redet.
-
Rambermann schrieb:
dachschaden schrieb:
Es ist also intelligenter, einfach ein Array dynamisch wachsen zu lassen? Hast du mal gemessen, wie teuer so ein
realloc
/malloc
ist? Und das soll elegant sein? Ich lach mich tot.Deswegen macht man das Blockweise, wie ich bereits schrieb.
Tot lachen kannst du dich gerne, dann haben wir zukünftig einen weniger hier, der Stuss redet.
Da ist er auch unterwegs und mir schwant Fürchterliches:
http://www.c-plusplus.net/forum/328628
-
@re342
das Einlesen kannst zB einfach mit fscanf machen
und zum speichern: http://www.c-plusplus.net/forum/325376
-
Hallo!
Vielen Dank für die Hinweise. Ich habe es nun hinbekommen :
* fscanf zum Einlesen der Datei
* Format der Zeilen vorgegeben, in lokalen Variablen gespeichert und diese an die Listen-Funktion übergeben
* Auf Anzahl der Zeilen der Datei verzichtet und stattdessen !=EOF benutzt.Gruß
-
Toll.
Du hast es 'hinbekommen'.
Die Daten bestimmen deinen Code.
Dein idealisierter Test läuft, d.h. dein Programm 'funktioniert'.
Deswegen ist dein Programm Praxismüll, d.h. in der Praxis (unter nicht idealisierten Bedingungen) Müll.