Problem mit Deiteinamenlänge
-
Lass dir einfach mal "variable.c_str()" ausgeben (wie Braunstein schon sagte).
-
Braunstein schrieb:
In W2k und WXP können die Dateinamen 255 Zeichen lang sein (inklusive Pfad). Das Problem ist wohl ein anderes.
das passiert manchmal schneller als man denkt.
C:\Dokumente und Einstellungen\meintollerbenutzername\Anwendungsdaten\blödeC++IDE\Profil2348\workspace\Projects\testprogramm\src\Daten\dateizumlesenmitlangemnamen.txt
sind noch lange keine 255 zeichen, aber die idee kam rüber? ^^
-
Habe mir auch schon zuvor meine Variable ausgeben lassen. Der Dateiname wird korrekt angezeigt. Es sieht nicht so aus als ob der String sonstige Zeichen enthält. Ich lese die Dateinamen aus einer anderen Datei, wo alle aufgelistetet sind, aus.
Meine Dateien gebe ich ohne Pfad an, da ich das Programm direkt im gleichen Ordner laufen lasse.
Abstürzen tut es nicht. Es öffnet mir einfach meine Datei nicht. Wenn ich es als Literal eingabe, also:ifstream file_stream("Dateiname.txt", ios::in); if (!file_stream) return false;geht es und die Datei wird zum Bearbeiten geöffnet. Ich benütze Dev C++ in der Version 4.9.9.2
-
Wenn der String den gleichen Dateinamen enthält, muss es gehen. Es muss also einen Unterschied geben. Zeig doch mal etwas mehr Code.
-
mach mal testweise bitte:
assert (variable == "Dateiname.txt");direkt vor den Code, den du gepostet hast. (<cassert> einbinden).
edit: scheiß copy&paste. Danke Braunstein
-
Mach das besser ohne c_str() sonst werden hier nur Pointer verglichen (oder war das die Absicht?).
-
Also mit assert wird das Programm abgebrochen!
Muss also doch einen Unterschied geben. Nur komisch, dass es bei einem kürzeren Dateinamen genau so wie ichs jetzt habe klappt?!Hier mal mein Code:
bool search(const string& file_name) { string file_intern("Abc-Abc"); file_intern += file_name; file_intern += ".dat"; assert (file_intern.c_str() == "Abc-Abc01234567890abcdefghijklmnopqrstuvwxyz.dat"); ifstream file_stream(file_intern.c_str(), ios::in); if (!file_stream) return false; cout << "blablabla"; return true; } int main() { ifstream file_stream("Auslesen.txt", ios::in); if (!file_stream) return -1; string input; while (file_stream.eof() == false) { for (unsigned short x = 0; (x < 3 && file_stream.eof() == false); ++x) { file_stream >> input; if (x == 0) search(input); } } system("PAUSE"); }Auslesen.txt sieht folgendermaßen aus:
01234567890abcdefghijklmnopqrstuvwxyz 12:00 11.06.2007 abcdefghijklmnopqrstuvwxyz01234567890 13:00 12.06.2007
-
Die Assertion ohne .c_str( )!
greetz, Swordfish
-
Sorry hat ich übersehen!
Gehen tuts so oder so nicht
-
sagte ich doch.

-
und woran liegts?!

-
OK, habe deinen Code kopiert (paar includes zugebaut), mir die Datei Auslesen.txt erstellt mit dem Inhalt
01234567890abcdefghijklmnopqrstuvwxyz 12:00 11.06.2007 abcdefghijklmnopqrstuvwxyz01234567890 13:00 12.06.2007und die Datei Abc-Abc01234567890abcdefghijklmnopqrstuvwxyz.dat einfach leer.
Wunderbar, "search" wird aufgerufen, ich komme durch die Assertion, er öffnet die Datei, der Stream ist OK (ich fliege also nicht vorzeitig raus).
Dann kommt der zweite Aufruf von "search" mit "abcdefghijklmnopqrstuvwxyz01234567890". Da fliege ich natürlich dann bei der Assertion raus, weil der Name ja diesmal ein anderer ist.Also alles, wie erwartet. Bei mir läuft dein Code.
-
bool search(const std::string& file_name) { std::string file_intern("Abc-Abc"); file_intern += file_name; file_intern += ".dat"; std::ifstream file_stream(file_intern.c_str(), std::ios::in); return (!file_stream ? false : true); } int main() { std::ifstream file_stream("Auslesen.txt", std::ios::in); if (!file_stream) return -1; std::string input; while (std::getline(file_stream, input)) if (search(input.substr(input.find_first_of(' '))) == false) std::cerr << "Zeile: " << input << std::endl; }
-
return (!file_stream ? false : true);rofl mao
-
hallo xr800,
wie wird der Dateistring denn erzeugt/geschrieben? vielleicht schwirrt ja am Ende noch so ein hässliches line feed / cariage return rum? Gib deshalb mal in deinem Programm den zuvor eingelesenen Dateinamen HEXADEZIMAL aus. Siehst du da irgendwo sowas wie 0A oder 0D?
von Ney