Text Files lesen
-
Hiho...
also ich machs ma kurz.... kann mir einer sagen was da nich funzt?
es soll eigentlich nur eine zeile aus ner datei gelesen werden, überprüft werden ob es die gesuchte ist (in dem die ID überprüft wird) und dann an die main function zurückgegben werden...void datei_lesen(char ident[7], char datei[12], char *ret) { FILE *in; char msg[2200]; char msg2[8]; fpos_t pos; int i; if ((in = fopen(datei, "r+t")) == NULL) { cout << stderr << "Fehler mit die Datei! Konnte nicht GE™FFNET werden!" << endl; } else{ do{ fgetpos(in, &pos); fgets(msg, 2200, in); fseek(in, ftell(in), 0); for(i=0; i<=7; i++) msg2[i] = msg[i]; msg2[8] = 0; } while(strncmp(msg2,ident,7)); int max = strlen(msg); for(i=0;i<=max;i++){ ret[i] = msg[i]; // cout << msg[i] << endl; } ret[strlen(ret)+1] = 0; cout << ret << "\n wurde gelesen!\n\n" << endl; fclose(in); } } void main() { clrscr(); char ret[2200]; datei_lesen("k111113", "test.txt", ret); cout << ret << "\n wurde gelesen!" << endl; getch(); }
habe aber total bekloppte fehler... z.B. wird aus der lese schleife ne endlos schleife wenn ich fgetpos auskommentiere, oder fseek weglasse....
auch funzt alles wenn die erste zeile die gesuchte ist... nur wenn es die 3. ist klappt die rückgabe nicht (ich kann RET in der function ausgeben, aber nicht in main...)
ich hab echt keine ahnung was ich da falsch mache und wieso es mal geht und dann net und überhaupt.... hoffe es gibt da ein paar leutz die da durchblicken...
ach und ich nutze übrigens den "Borland Turbo C++ 3.01"... weil ich ihn nutzen muss (sch*** schule), damit dürfte auch klar sein das alles unter DOS läuft... also urig...
danke schonmal an alle die sich dem problem annehmen!!
DeR_FiScH
-
Schäm dich! Kommst ins C++ Forum und benutzt ANSI C (FILE)
Kusch kusch wenn schon fstreams :D:D:D
-
Also, dass deine Schleife eine Endlosschleife wird, is irgendwie klar!
do{ fgetpos(in, &pos); fgets(msg, 2200, in); // hier liest du 2200 zeichen aus einer Datei fseek(in, ftell(in), 0); for(i=0; i<=7; i++) msg2[i] = msg[i]; // die ersten 8 davon kommen in msg2 msg2[8] = 0; } while(strncmp(msg2,ident,7)); // hier vergleichst du sie dann mit ident
Wenn die nicht ident sind, liest er die nächsten 2200 zeichen aus und vergleicht wieder nur die ersten 8 davon.
Da du aber die Schule erwähnt hast, musst du schon selber auf die Lösung kommen. Deine Kammeraden "schummeln" ja (hoffentlich) auch net.
Einen Tipp geb' ich dir: Schau dir mal die Funktionen str*cmp() nochmal an.
Ok .. 2 Tipps: Du solltest msg2 besser rotieren lassen.
-
hi...
sorry das ich mich im forum vertan habe!
thx dennis das du dir das ma angelookt hast! leider hab ich keinen plan was du mir da sagen willst
es ist absicht das er 2200 zeichen liest (alle informationen die ich brauche) und nur 8 vergleicht (nämlich die ID). das ganze soll quasi so datenbank mässig sein...
und schule schummeln... das hat nix mit schummeln zu tun... ist nur das mir ja irgendwer helfen muss, da mein lehrer ne flachpfeife ist der das nicht kann... und meine mitschüler kommen da auch net wirklich weiter...
für jede weitere antwort / tip / oder ähnlichem wäre ich dankbar...
edit:
habs hinbekommen, die tips von dennis haben doch gereicht!
ausserdem habe ich festgestellt wie praktisch der debugger von MVC++ ist...falls es einen interessiert wie es nu aussieht
void datei_lesen(char ident[7], char datei[12], char *ret) { FILE *in; char msg[2200]; int i; if ((in = fopen(datei, "r+t")) == NULL) { cout << stderr << "Fehler mit die Datei! Konnte nicht GE™FFNET werden!" << endl; } else{ do{ // ein wenig kürzer ;) fgets(msg, 2200, in); } while(strncmp(msg,ident,7)); int max = strlen(msg); for(i=0;i<=max;i++){ ret[i] = msg[i]; } ret[strlen(ret)+1] = 0; cout << ret << "\n wurde gelesen!\n\n" << endl; fclose(in); } }
greetz
DeR_FiScH