Problem mit der Verknüpfung 2er Funktionen
-
Hallo mal wieder,
ich bin mir nicht ganz sicher ob ich mit meiner Frage im richtigen Forum bin, da ich meinen Code ein bisschen mische, aber da die betroffenen Funktionen einiges aus der WinAPI enthalten versuch ich mal mein Glück.
Meine erste Funktion listet mir alle test*.xyz Dateien aus einem bestimmten Win Verzeichnis auf.
Meine zweite Funktion liest die erste Zeile einer Textdatei aus und speichert diese in eine Variable zur weiteren Verwendung.Problem: Ich würde gerne auf jedes einzelne Ergebnis der ersten Funktion zugreifen können, um jede Datei/ergebnis mit der zweiten Funktion auslesen zu können.
Wäre echt super wenn mir jemand weiterhelfen könnte.
Hier die Funktionen wie sie imo aussehen:
1. Aufrufe in main mit Übergabeparametern:
string line; char root[MAX_PATH]; dirsearch(root, "\\beispiel", "\\test*.xyz"); //Übergabe des Root Verzeichnisses(C:\Winnt), Beispielordner, zu suchende Dateien read_line("c:\\test.txt", line); // bisher: konstanter String wird übergeben2. Funktionen
void dirsearch(char path[MAX_PATH], const string& folder, const string& filter) { HANDLE hFindFile; WIN32_FIND_DATA wfd; string buf; buf = path + folder + filter; cout << "Es wird gesucht nach: " << buf << endl << endl; cout << "Suchergebnisse:\n" << endl; hFindFile = FindFirstFile(buf.c_str(), &wfd); if (hFindFile != INVALID_HANDLE_VALUE) { do { if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) { cout << wfd.cFileName << endl; } }while(FindNextFile(hFindFile, &wfd) != 0); FindClose(hFindFile); } } bool read_line(const string& filename, string& line) { ifstream file_stream; file_stream.open(filename.c_str(), ios::in); if (file_stream.is_open() == false) { return false; } if (file_stream.is_open() == true && file_stream.good() == false) { cout << "Dateiinhalt ist nicht lesbar!" << endl; file_stream.close(); } else { getline(file_stream, line); file_stream.close(); return true; } return false; }kurz noch als Anmerkung: der Code an sich läuft ohne Probleme, ich verwende VS 2005 Prof unter W2K
-
Die einfachste Möglichkeit ist es, anstelle des "cout << wfd.cFileName << endl;" den Aufruf der zweiten Funktion reinzuschreiben. Wenn du erst päter entscheiden willst, was du mit den gefundenen Dateien machen willst, kannst du sie in einem vector<string> sammeln und zurückgeben.
-
Mit Vektoren kenn ich mich noch nicht so gut aus, ich bastel aber mal ein bisschen rum und schau ob ichs vielleicht hinbekomm...
Trotzdem vielen Dank für die schnelle Hilfe.Könntest du mir vielleicht zeigen wie du die readline Funktion in die erste Funktion integrieren würdest, v.a. in Bezug auf die zu übergebenden Parameter?
-
Hat vielleicht irgendjemand ein Code Beispiel für mich. Ich bin leider nicht weitergekommen.
Vielen Dank schonmal.
-
Wenn du die readline()-Funktion direkt einbauen willst, kannst du die cout<<... Zeile einfach ersetzen durch
string line; if(readline(wfd.cFileName,line); { ...//mach was mit der eingelesenen Zeile }der allgemeinere Ansatz sieht etwa so aus:
void dirsearch(const string& path, const string& folder, const string& filter, vector<string>& namelist) { HANDLE hFindFile; WIN32_FIND_DATA wfd; string buf = path + folder + filter; cout << "Es wird gesucht nach: " << buf << endl << endl; hFindFile = FindFirstFile(buf.c_str(), &wfd); if (hFindFile != INVALID_HANDLE_VALUE) { do { if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) { namelist.push_back(wfd,cFileName); } }while(FindNextFile(hFindFile, &wfd) != 0); FindClose(hFindFile); } } ... vector<string> files; dirsearch(root,"\\beispiel","\\test*.xyz",files); for(vector<string>::iterator p=files.begin();p!=files.end();++p) { string zeile; if(read_line(*p,zeile)) ...//mach was }
-
Vielen Dank CStoll.
ich hab mich jetzt für die "einfachere" Lösung entschieden, da beim experimentieren mit dem vector nix gescheites rausgekommen ist. Der Code lässt sich auch ohne Probs compilieren...
Aber: leider öffnet er mir jetzt nicht mehr meine Dateien bzw. springt mir in der read_line Funktion bei der ersten Fehlerabfrage raus
Liegt wohl an den Parametern, aber ich finde einfach nicht den richtigen Typ, damit mir die Funktion True zurückliefert
Hier der angepasste Code://Prototypen void dirsearch(char[], const string&, const string&); bool read_line(string, string&); ... //Aufruf in main char root[MAX_PATH]; ... dirsearch(root, "\\Beispiel", "\\test*.txt"); ... //angepasste Funktionen void dirsearch(char path[MAX_PATH], const string& folder, const string& filter) { HANDLE hFindFile; WIN32_FIND_DATA wfd; string buf; string line; ... if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) { if(read_line(wfd.cFileName,line) == 0) { cout << "An error occured reading" <<wfd.cFileName << endl; } else { cout << "lässt sich oeffnen" << endl; } } bool read_line(string filename, string& line) // <--hier liegt mein Problem, { ifstream file_stream; file_stream.open(filename.c_str(), ios::in); // ...denn das scheitert if (file_stream.is_open() == false) { cout << "oeffnen der Datei ist gescheitert\n"; return false; } ... else return true;Wär super wenn mir nochmal geholfen werden könnte

-
So habs jetzt alleine hinbekommen, zwar nicht gerade elegant(mit bösen globalen Variablen
) aber egal, Hauptsache es funzt.
Ich wär trotzdem nicht böse, wenn mir noch einer einen eleganteren Weg sagen/posten könnte.
Danke nochmal an Dich CStoll
-
ITAzubi23 schrieb:
Ich wär trotzdem nicht böse, wenn mir noch einer einen eleganteren Weg sagen/posten könnte.
Schau mal ein Stück nach oben - der Code in meinem letzten Beitrag IST der elegantere Weg

-
Mag sein, aber da gibt mir der Compiler 18 Fehler aus

Da müsstest du einem Noob wie mir schon noch ein bissel mehr erklären (welche defines, includes etc.) um das zum laufen zu bekommen...
-
ITAzubi23 schrieb:
Mag sein, aber da gibt mir der Compiler 18 Fehler aus

Wird das jetzt zu einem lustigen Ratespiel ala "was könnte dem Compiler Probleme bereiten"? Wenn du Hilfe erwartest, mußt du die Fehlermeldungen schon angeben.
Da müsstest du einem Noob wie mir schon noch ein bissel mehr erklären (welche defines, includes etc.) um das zum laufen zu bekommen...
Du brauchst die Header <string> (für std::string) und <vector> (für std::vector<>) und eventuell die passenden using-Direktiven, wenn du zu faul bist, vor alle Bezeichner std:: zu schreiben.
-
Ich hab mir schon gedacht, dass der Spruch mit dem Ratespiel kommt

Aber du hast mir die Antwort trotzdem geliefert, ich hab <vector> nicht inkludiert, ich versuch jetzt mal mein Programm umzubauen und meld mich nochmal bei Problemen. Danke nochmal.
Bis dann.
-
Uff-geschafft-läuft

Hattest Recht ist eleganter, ich danke dir für deine super Hilfe.
Bis zum nächsten Mal
-
ITAzubi23 schrieb:
Ich hab mir schon gedacht, dass der Spruch mit dem Ratespiel kommt

Ja, der Spruch mit der Kristallkugel wirkt nicht mehr
