Probleme mit filepointer?
-
Ich suche in einem bestimmten Ordner mit FindFirst,FindNext,FindClose alle Dateien.
Bekomme auch alle Dateien zurück,das klappt soweit.Wenn eine Datei gefunden wurde suche ich sie zeile für zeile nach einem bestimmten string ab.
Klappt auch soweit, allerdings nur beim 1. file!!wenn ich das zweite file öffnen will, bekomme ich immer null(eof?, bzw fehler) zurück...
was könnte da nicht stimmen??
danke für eure hilfe!
claudia
-
code zeigen?!
-
eventuell solltest du nach (oder vor) dem Schließen des alten Files die Fehlerflags löschen (bei STL fstreams geht das mit clear()).
-
hier ist meine funktion:
bool TForm1::StringSuche(AnsiString Horde) { AnsiString file; TSearchRec sr; int iAttributes = 0; bool rc=false; FILE *fp; iAttributes |= faAnyFile * 1; SuchString=Edit2->Text; if (FindFirst(Edit1->Text, iAttributes, sr) == 0){ do{ memset(file.c_str(), '0', strlen(file.c_str())); strncpy(file.c_str(),"D:\\ZumOfen\\",13); AnsiString temp= sr.Name; filename="D:\\ZumOfen\\"; filename.cat_sprintf("%s",sr.Name); strcat(file.c_str(),temp.c_str()); .... //file öffnen und einiges auslesen, anschließend wieder schließen } while (FindNext(sr) == 0); //do FindClose(sr); } //if (FindFirst return rc; }@CStoll:
gibt es so ein clear() in meinem fall auch?
-
Bitte wende keine char* Funktionen auf AnsiString an. Das geht viel einfacher. Desweiteren darfst du nicht auf AnsiString::c_str() schreiben. Wozu auch.
Mach mal aus dem hiermemset(file.c_str(), '0', strlen(file.c_str())); strncpy(file.c_str(),"D:\\ZumOfen\\",13); AnsiString temp= sr.Name; filename="D:\\ZumOfen\\"; filename.cat_sprintf("%s",sr.Name); strcat(file.c_str(),temp.c_str());Das hier
file = "D:\\ZumOfen\\"; file += sr.Name; filename = file;Warum willst du die alten C-Filepointer verwenden? Es gibt ja auch streams (ANSI-C++) bzw. die Streamklassen der VCL (TFileStream).
-
Erstmal dürfte AnsiString auch vernünftige Operatoren zur Verkettung etc. haben - da ist dieses Gebastel' mit memset, strcpy,... überflüssig. Und zum zweiten ist schwer zu sagen, was dort hilft, wenn du die File-Operationen ausklammerst - ich würde freopen() verwenden (oder auf fstreams wechseln).
-
Falls das Textdateien sind, eignet sich TStringList hervoragend zum Einlesen und suchen.
Im AnsiString Horde steht das Suchwort?//irgendwo vor der Schleife: TStringList* slDatei = new TStringList(); slDatei->LoadFromFile(filename); rc = slDatei->Text.AnsiPos(Horde); // Fals der Text im AnsiString Horde in der Datei ist, ist rc = true, sonst false //nach der Schleife delete slDatei;
-
danke, das mit den strings habe ich geändert!
aber zum anderen:
gibt es eine funktion mit der ich bei fopen die fehler flags löschen kann?
-
Schau mal nach clearerr