Datei über Kommandozeile mit Schalter einlesen

Hallo HaBos!

Ich programmiere gerade ein wenig in C++ und habe folgendes Problem:

Wie kann ich eine Datei nur über die Kommandozeile einlesen?

Ich lese die Datei derzeit so ein:

Code:
const char *inputFilePath = "C:\\Dokumente und Einstellungen\\User\\Eigene Dateien\\datei";

Er soll mir aber eine Datei mit dem Schalter --f über die Kommandozeile einlesen.

Weiss irgendjemand, wie ich das genau mache? Bin ziemlich neu in C++, also Code wäre hilfreich.

Danke im Vorraus!

mfg
lynx
 
in deiner main-function gibts

__targc <- anzahl der kommandozeilenparameter

und

__targv <- array, wo alle parameter drinstehen. __targv[0] = pfad zu deiner exe.

also:

Code:
deinprogramm.exe --f "C:\test\bla.txt"

wäre der aufruf.

dann kommst du so an den dateinamen:

Code:
CString dateiname = __targv[2];

0 = pfad zu deiner exe
1 = --f
2 = C:\test\bla.txt

alles klar?
 
stimmt. ich bin jetzt davon ausgegangen, dass die main so definiert ist:

Code:
int main (int argc, char *argv[]) {...}
 
Original von M4CH!N3
stimmt. ich bin jetzt davon ausgegangen, dass die main so definiert ist:

Code:
int main (int argc, char *argv[]) {...}

ja, so hab ich das auch gelernt (wohl aber auch, da wir in der uni eh fast immer parameter übergeben), aber in vielen tutorials sehe ich leider immer wieder die kurze variante
 
Original von lightsaver
ja, so hab ich das auch gelernt (wohl aber auch, da wir in der uni eh fast immer parameter übergeben), aber in vielen tutorials sehe ich leider immer wieder die kurze variante

Das kommt bestimmt daher, dass viele Leute die Kommandozeile nicht mehr nutzen bzw. sie überhauptnicht kennen.
Ich kenne viele Leute, die mich nur verwundert angesehen haben, als ich zu denen meinte "Übergib doch einfach den Parameter per Kommandozeile"...
 
@lightsaver: Ja, meine Main ist so defininiert:

Code:
int main(int argc, char* argv[])

Leider blicke ich das mit dem

Code:
__targc <- anzahl der kommandozeilenparameter

und

Code:
__targv <- array, wo alle parameter drinstehen. __targv[0] = pfad zu deiner exe

nicht.

Wie ist jetzt genau der Code, wenn ich das über die Kommandozeile machen will?

Code:
CString dateiname = __targv[2];
-> das wäre also die Variable für das Datei einlesen?

mfg,
lynx
 
Mensch.. is doch garnicht so schwer ;)

Deine Kommandozeile lautet:

Code:
       0              1               2
C:\deinprogramm.exe --f deinetolledatei.txt

0 = argv[0]
1 = argv[1]
2 = argv[2]

In deinem Programm dann:
Code:
#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
    CString parameter0 = argv[0];
    CString parameter1 = argv[1];
    CString parameter2 = argv[2];

    cout << parameter0 << endl;
    cout << parameter1 << endl;
    cout << parameter2 << endl;

    system("PAUSE");

    return 0;
}

Benutz einfach mal den o. g. Code. Dann siehst du, wie das geht. Vorausgesetzt natürlich, du weißt, was ein Array ist ;)

EDIT: aus __targv ein argv gemacht, dass er nicht verwirrt wird ;)
 
Ist bloß blöd, wenn jemand auf die Idee kommt, das Programm noch mit anderen Paramtern aufzurufen, wie beispielsweise -v -f <dateiname>. Und außerdem ist es bei der Variante dem Programm egal, ob es per -f <dateiname> oder --guglhupf <dateiname> aufgerufen wird. --file=<dateiname> geht hingegen aber nicht. Es ist also eher eine Art "poor man's parameters". ;)

Ich weiß nicht, wie es konkret unter C++ aussieht, aber ich vermute mal frech, dass es zum Parsen der Parameter vorgefertigte Bibliotheken gibt.
 
Ich wollte ihm damit ja nur zeigen, wie die Parameter funktionieren. Parsen muss er sich das allein.

Afaik gibt es keine extra Bibliothek dafür. Meines Erachtens nach auch nicht notwendig. Die Parameter kann man ja in ein paar Zeilen parsen..

z B:
Code:
for( int i = 1; i < argc; ++i )
{
    if( _wcsicmp( argv[ i ], "--f" ) == 0 )
    {
        if( ++i < argc )
        {
            CString sFilename = argv[ i ];
        }
    } 
    else
    {
        //stuff with other parameters
    }
}

Muss nicht funzen, hab ich mir grad n bisschen ausgedacht ;) so in der Art sollte es aber gehen.

EDIT: Codeformatierung.
 
Man kann das so loesen das man bei einem unbekannten Parameter einfach das benutzermenue ausgibt wie bei -help oder dergleichen.
die Kommandozeilenprogramme funktionieren nicht anders.
mfg

sw33t

//edit
shit zu langsam
 
Original von Diabeles
Ich weiß nicht, wie es konkret unter C++ aussieht, aber ich vermute mal frech, dass es zum Parsen der Parameter vorgefertigte Bibliotheken gibt.

Da gibts eine allgemeine, für mittlerweile glaub jedes OS vorhandene Bilbiothek:
popt, Google bietet genügend Hilfe dazu.
 
Wenn du sonst keine Parameter übergibst kannst du dir den Schalter -f sparen.
Der erste Parameter wäre dann immer die Datei. Dann kannst sie sogar per Drag&Drop über die Exe drüber ziehen und schon kanns los gehen.

@all: tut mal diese CStrings weg.

Code:
char *file_name;

if(argc>1) /* File wurde übergeben */
   file_name = argv[1];
 
Original von mauralix
Wenn du sonst keine Parameter übergibst kannst du dir den Schalter -f sparen.
Der erste Parameter wäre dann immer die Datei. Dann kannst sie sogar per Drag&Drop über die Exe drüber ziehen und schon kanns los gehen.

@all: tut mal diese CStrings weg.

Code:
char *file_name;

if(argc>1) /* File wurde übergeben */
   file_name = argv[1];

warum die CStrings weg?

In deinem Beispiel würde ich dann anstatt char lieber TCHAR nehmen, sonst bekommst du eventuelll Probleme bei Unicode-Sachen.
 
Zurück
Oben