Forum: PC-Programmierung MS Visual C++ 2008, Kommandozeilenargument, zu öffnende Datei


von Albert M. (rheumawalzer)


Lesenswert?

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.

von Andreas B. (andreasb)


Lesenswert?

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

von Albert M. (rheumawalzer)


Lesenswert?

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.

von Andreas B. (andreasb)


Lesenswert?

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

von Albert M. (rheumawalzer)


Lesenswert?

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.

von Andreas B. (andreasb)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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.

von Andreas B. (andreasb)


Lesenswert?

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

von Albert M. (rheumawalzer)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.