MS Visual C++ 2008, Kommandozeilenargument, zu öffnende Datei

OP #2588867
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.
OP #2588899
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.
#2588909
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
OP #2588963
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.
#2589011
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
#2589063
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
OP #2589315
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
Persönliche Seite #2589369
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>

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren