Liebe Leute, es geht um eine klassische WIN32-Konsolenanwendung. Die braucht als Argument in der Kommandozeile den Namen der Datei, die damit geöffnet werden soll, also formal: programm.exe datei.txt Das Programm ist erstellt und läuft fehlerlos, auch den Namen der Datei an Visual C++ zu übergeben klappt (in Projekt/Eigenschaften/Debugging/Befehlsargumente). Das Problem ist nur: er findet die Datei nicht, obwohl sie im Arbeitsverzeichnis vorhanden ist. Habe ich irgendeine Pfadangabe übersehen? Ich hoffe, ihr könnt helfen. Vielen Dank schon mal, A.
printf("%s\n", getcwd()); Und du Siehst wo die Applikation wirklich ausgeführt wird. Dann machst du mal in einer Konsole cd "Pfad" und wenn das klappt dir. Und warscheinlich ist dann die Datei doch am falschen Ort;-) mfg Andreas
Hallo Andreas, vielen Dank, das war ein guter Ansatzpunkt! Genaugenommen heißt die Funktion char* _getcwd(char* buffer, int maxlen), und zusammen mit einem #include direct.h liefert sie tatsächlich mein Arbeitsverzeichnis, wo sich die zu öffnende Datei auch befindet. Das hätten wir also abgeklärt. MS zickt aber immer noch rum, er fände die Datei nicht. Any suggestions? A.
Albert M. schrieb: > vielen Dank, das war ein guter Ansatzpunkt! Genaugenommen heißt die > Funktion > char* _getcwd(char* buffer, int maxlen), Oder so. > Das hätten wir also abgeklärt. MS zickt > aber immer noch rum, er fände die Datei nicht. > > Any suggestions? Code? Wie öffnest du die Datei? Bist du dir sicher das alles stimmt? z.B. blendet Windows gerne mal die Dateiendungen aus im Explorer... mfg Andreas
Hallo Andreas, du könntest ja mal spaßeshalber mein kleines Testprogramm übernehmen und auf deinem VC++ 2008 ausprobieren: // -------------- Beginn Testprogramm -------------------- #include <iostream> #include <iomanip> #include <cstring> #include <cstdio> #include <cstdlib> #include <direct.h> using namespace std; /*********************************************************************** **/ /* Prozedur "error" gibt die Fehlermeldungen aus. */ /*********************************************************************** **/ void error(const char *message){ cerr<<message; getchar(); exit(EXIT_FAILURE); } /* Ende von error() */ //********************************************************************** ** int main( const int argc, const char* argv[]){ system("cls"); if(argc!=2) error("\nZu viele oder zu wenig Argumente!\n"); char commandlinestring[30]; strcpy(commandlinestring,argv[1]); cout<<"\nDer String aus dem Argument Vektor lautet: "<<commandlinestring<<endl; // ...und hier ist der Vorschlag von Andreas: char buf[200]; cout<<"\nArbVz: "<<_getcwd(buf,190); FILE *datei; datei=fopen(commandlinestring, "r"); if(datei==NULL) error("\n\nFehler: Datei nicht gefunden!\n"); else cout<<"\nErfolgreich!\n"; fclose(datei); return EXIT_SUCCESS; }// Ende main() // -------------- Ende Testprogramm -------------- Vielen Dank für dein Engagement, Grüße, A.
Albert M. schrieb: > Hallo Andreas, > > du könntest ja mal spaßeshalber mein kleines Testprogramm übernehmen und > auf deinem VC++ 2008 ausprobieren: Ich habe kein VC++ hier, ich verwende Linux;-) Aber ich sehe böses... Ich kürze mal alles raus was irrelevant ist... > int main( const int argc, const char* argv[]){ > > system("cls"); > if(argc!=2) error("\nZu viele oder zu wenig Argumente!\n"); > char commandlinestring[30]; 30 ist relativ wenig. Dateinamen dürfen unter Windows wesentlich länger sein. (128 oder 256 Byte, gibt eine Konstante dafür, die ich gerade nicht auswendig weiss). Nim mal 256. > > strcpy(commandlinestring,argv[1]); Hui, tendenzieller Stackoverflow: strncpy verwenden! -> strncpy(commandlinestring,argv[1], sizeof(commandlinestring)); Der Rest sollte eigentlich funktionieren, sofern der Dateiname nicht zu lange ist. Mach mal sowas: if(datei==NULL) { cout << "Datei: " << buf << "\\" << commandlinestring << endl; error("\n\nFehler: Datei nicht gefunden!\n"); } Dies gibt dir den kompletten Pfad zur Datei aus. Entweder ist der falsch, oder du hast z.B. keine Zugriffsrechte etc. Wenn du den Pfad in den Explorer kopierst müsste die Datei geöffnet werden. mfg Andreas
Andreas B. schrieb: > strncpy(commandlinestring,argv[1], sizeof(commandlinestring)); nein man sollte schon strncpy(commandlinestring,argv[1], sizeof(commandlinestring)-1 ); verwenden und sichersteleln das am ende ein 0 byte steht.
Peter II schrieb: > Andreas B. schrieb: >> strncpy(commandlinestring,argv[1], sizeof(commandlinestring)); > > nein man sollte schon > strncpy(commandlinestring,argv[1], sizeof(commandlinestring)-1 ); > > verwenden und sichersteleln das am ende ein 0 byte steht. grml... Da hat Peter wohl recht, "n" ist die maximale Anzahl der Zeichen, nicht Bytes wie bei memcpy. ps. an Albert: std::string macht da wesentlich weniger Probleme... mfg Andreas
Lieber Andreas (und Peter), 1/ Du bist ein Linuxer, ich auch, wie sympathisch! Fühle mich auf der Konsole am wohlsten, habe deswegen vermutlich auch etwas Schwierigkeiten mit der IDE von MS VC++. Ist mir eigentlich alles zu bunt... 2/ Eure C-Verbesserungsvorschläge nehme ich gerne auf, an strncopy statt strcpy und natürlich std::string ist schon was dran. 3/ Und dein Hinweis, dass Windows (nein, ich sage jetzt nicht Windoof) gerne mal die Dateiendungen ausblendet im Explorer, hat mir keine Ruhe gelassen. Du hattest recht: Die Datei, die zu öffnen war, hieß datei.txt.txt und nicht datei.txt. Das konnte VC natürlich nicht finden... Draufgekommen bin ich nur, weil ich das ganze Problem auf die Kommandozeile verlagert habe, also in der virtuellen DOS-Box: cl programm.cpp datei.txt und siehe da, es fuktionierte alles wie es sollte. Also Leute, bedanke mich bei allen aktiv und passiv Mitwirkenden ganz herzlich, besonders aber bei Andreas. Wenn ich mich mal revanchieren kann, lass es mich wissen... Herzliche Grüße, Albert
Albert M. schrieb: > weil ich das ganze Problem auf die > Kommandozeile verlagert habe, also in der virtuellen DOS-Box: Das ist keine DOS-Box, keine virtuelle und auch keine reale. Sondern einfach nur ein Konsolenfenster, durchaus zu vergleichen mit xterm (für die Freunde unixoider Systeme). Die darin laufende Shell (cmd.exe) ähnelt dem alten DOS-Kommandozeileninterpreter, aber kann erheblich mehr. Und hier aufgerufene Programme sind Win32-Prozesse, keine 16-Bit-DOS-Programme. </pedant>
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.