txt file einlesen
-
richard92 schrieb:
...
Wenn in einer Zeile eine Falscheingabe ist muss ich auch diese Zeile in welcher die Falscheingabe war ausgeben, also muss ich soweit ichs beurteilen kann die Zeilen seperat in ein Array einlesen, ...Die Funktion fgets liest deine Zeile komplett in ein Array ein, wenn das Array groß genug ist. Die Auswertung kannst du also sofort nach fgets starten.
Die Ausgabe einer Falschzeile inklusive Zeilennummer kann dann auch sofort nach der Auswertung erfolgen, wenn du deiner Einlesefunktion einen Zähler spendierst, der die eingelesenen Zeilen zählt. Damit ist dein Problem gelöst.
Wenn du die (Falsch)Zeilen für spätere Ausgaben, Auswertungen, etc. brauchst,
kannst du:- Die Zeilen in char Arrays speichern(Stichwörter: dynamisches Array, char**).
- Die Zeilen in einer anderen (temporären) Datei speichern(tmpfile, tmpnam, fopen).
- Die Positionen der Zeilenanfänge per ftell in einem Array speichern( dynamisch, long int*).
-
CJosef schrieb:
- Die Zeilen in char Arrays speichern(Stichwörter: dynamisches Array, char**)
Es gibt in C keine dynamischen Arrays, im Gegenteil, es ist gerade das entscheidende Merkmal eines Arrays, dass es bei seiner Definition eine feste Anzahl Elemente vorgegeben werden muss, die leidigen VLA mal ausgenommen, wobei die zumindest in C11 ja wenigstens nur noch optional sind und nicht mehr obligatorisch wie in C99.
-
richard92 schrieb:
Von daher müsst ich die Zeilen explizit behandeln können, nur wie geht das ist die Frage.
Kann man sich hier vielleicht eine Variable machen welche sich merkt wo ich im txt file war, oder geht das nur seeehr viel komplizierter?Nicht eine Variable sondern für jede Zeile eine.
typedef struct {char zeile[100];int ok;int wert;} Wert; ... Wert werte[1000];
Und dann liest du erstmal alle Zeilen in das struct-Array und kannst dann anschließend, nachdem du die Datei wieder geschlossen hast, in aller Ruhe die Daten verarbeiten.
-
Wutz schrieb:
CJosef schrieb:
- Die Zeilen in char Arrays speichern(Stichwörter: dynamisches Array, char**)
Es gibt in C keine dynamischen Arrays, im Gegenteil, es ist gerade das entscheidende Merkmal eines Arrays, dass es bei seiner Definition eine feste Anzahl Elemente vorgegeben werden muss, die leidigen VLA mal ausgenommen, wobei die zumindest in C11 ja wenigstens nur noch optional sind und nicht mehr obligatorisch wie in C99.
Na sicher kann ich mit malloc/calloc ein dynamisches Array erzeugen.
-
So jetzt hab ich das mit dem Struct Array so halbwegs hinbekommen.
while (fgets(GetInput[count].line_,sizeof(GetInput[count].line_), f) != NULL) { GetInput[count].line_count_ = count + 1; count++; }
Mein Problem ist, dass er hier bei jedem Leerzeichen abbricht, ich möchte es aber nur am Ende einer Zeile beenden. Ich hab es bereits mit != EOF probiert, sonst hab ich leider kp was ich hier noch änder könnte.
LG
-
Wer er?
fgets bricht ggü. fscanf("%s") nicht bei Leerzeichen ab. Da hast du was falsch gemacht.
-
Irgendwie hab ich da an den Compiler gedacht ;).
ich verwende noch gar kein fscanf.
Hier der ganze Code:
struct _input_ { char line_[100]; int line_count_; } GetInput[100]; int main() { FILE *f = 0; char file_name[7]; int count = 0; int count_output_struct = 0; printf("Please enter your inputs' file path:"); scanf("%s", file_name); f = fopen(file_name, "r"); if (f == NULL) { printf("Invalid Filename!"); return 0; } while (fgets(GetInput[count].line_,sizeof(GetInput[count].line_), f) != NULL) { GetInput[count].line_count_ = count + 1; count++; } for (count = 0; count <= 100; count++) { printf ("%c", GetInput[count_output_struct].line_[count]); if (count == 1) { count = 0; count_output_struct++; } if (count_output_struct == 100) break; } printf ("\n") return 0; }
wobei die ausgabe nur zur Überprüfung ist was alles eingelesen wird.
lg
-
- printf("%c") ist natürlich falsch
- die in der while-Schleife ermittelte Anzahl der Zeilen count wirfst du bei for wieder weg
- das andere Zeugs in for habe ich nicht verstanden und ist wohl Unsinn
-
Wutz schrieb:
- das andere Zeugs in for habe ich nicht verstanden und ist wohl Unsinn
Wenn man die Laufbedingung der Schleife richtig macht, braucht man das auch gar nicht:
for (count = 0; count < 100; count++) // Nur < (kein <=)
-
GetInput[count].line_count_ = count + 1;
hier speichere ich ja die Zeilennummer ins jewilige struct array.
mir gehts eher darum war wenn ich einen text habe in einer txt file.asdf asdf
asdfdann speichert er mir nur das erste asdf.
lg
-
Schreib doch mal ein
printf("%s", GetInput[count].line_);
in deine while Schleife, dann siehst du ja ob aus der Datei alles ins Programm
reinkommt und dann kannst du weitersuchen, wo etwas misteriöserweise verschwindet.
-
Und nimm mal eine Testdatei mit unterschiedlichen Zeichen in den Zeilen.
-
So jetzt macht mein Programm mal alles so, dass zumindest auch die richtigen Funktionen gestartet werden abhängig zur Eingabe.
Jetzt versteh nur noch nicht so ganz wie ich mein char array [5] - [7] in eine Variable speichern sollt mit einem dezimalen bzw. hexadezimal Wert.lg
-
#include <stdlib.h> #include <stdlio.h> int d,x,i; char line[100] = "Hallo123"; d=strtol(line+5, NULL, 10); x=strtol(line+5, NULL, 16); i=strtol(line+5, NULL, 0); // oder sscanf(line+5,"%3d", &d); // ab line[5] maximal 3 Zeichen sscanf(line+5,"%3x", &x); sscanf(line+5,"%3i", &i);