Kommandozeilenparameter übergeben



  • Hallo meine Freunde 🙂

    ich habe ein neues projekt und bin wieder einmal auf eure Hilfe angewiesen 😃

    Folgender Fall:

    ein Shell-Script ruft mein Programm auf und gibt Quelldatei + Zieldatei an..

    PROGRAMM C:\Quelle.txt C:\Resultat.txt
    

    Über Kommandozeilenparameter soll nun das Programm die Quelldatei aufrufen und alle Zeilen einlesen..

    zu dem Abspeichern in die Zieldatei bin ich erstmal noch nicht gekommen

    int main ( int argc, char* argv[] ){
    
    string line;															  // Line puffer
    
    char sfile;																// Sourcefile		( argv[1] )
    //char* rfile;															// Resulting file	( argv[2] )
    
    FILE *sfile;
    
    if(sfile==NULL)															// Sourcefile empty
    	{
    	cerr(NULL);
    	}
    
    else
    	{
    	sfile=fopen(argv[1],"r");											// Open sourcefile	( argv[1] )
    	if(sfile!=NULL)
    		{
    		while(getline(sfile,line))										// Reading Lines
    		vect.push_back(line);											// Puts into <vector>
    		}
    	else
    		{
    		cout << "COULDN'T OPEN FILE: " << argv[1] << endl;				// Not available	( argv[1] )
    		}
    

    Vor lauter Änderungen und Fehlerausgaben, häng ich jetzt an der Stelle 🙄

    Vielleicht sieht ja einer von euch hier durch 😃

    danke



  • Mal davon abgesehen, dass ich nirgends eine Frage sehe, würde ich Dateien in C++ immer mit Hilfe von Streams bearbeiten. Das ist doch wesentlich komfortabler. Also etwa:

    #include <iostream>
    #include <fstream>
    using namespace std;
    
    int main(int argc, char** argv) {
    
        if (argc != 3) {
    		return -1;
    	}
    
    	ifstream in(argv[1]);
    	ofstream out(argv[2]);
    
    	if ((!in.is_open()) || (!out.is_open())) {
    		return -1;
    	}
    
        out << in.rdbuf();
    
    	in.close();
    	out.close();
    
    	return 0;
    
    }
    


  • die Frage war einfach die: was ist daran falsch, da ich fehlermeldungen bekomme 🙂

    ps.danke 😉



  • Was daran falsch ist?

    char sfile;
    FILE *sfile;

    ... du hast 2 Variablen mit dem selben Namen ...

    #include <iostream>
    #include <fstream>
    
    int main(int argc, char** argv)
    {
        if (argc != 3) return -1;
    
        std::ifstream in(argv[1]);
        std::ofstream out(argv[2]);
    
        if (!in || !out)return -1;
        out << in.rdbuf();
    }
    


  • und wenn du Fehlermeldungen hast und um Hilfe bittest, waere es natuerlich hilfreich, wenn du auch die Fehlermeldungen mit postest. Dann faellts leichter, nach der ursache zu suchen 🙂



  • ich denke dein problem ist jenes, dass deine CMD Line (also in deinem Fall: C:\Quelle.txt C:\Resultat.txt) Leerzeichen enthält.

    Denn sobald dein ein Leerzeichen vorhanden (z.b C:\hallo du da.txt) ist schaut das Ganze so aus:

    arg[0] = Pfad von deiner EXE Datei
    arg[1] = C:\hallo
    arg[2] = du
    arg[3] = da.txt

    1. Verwende AnsiString's die sind deutlich einfacher
    2. Überprüfe deinen Dateipfad immer irgendwie (z.b mit cout oder printf oder du kannst auch ShowMessage verwenden
    3. Wenn dein Dateipfad irgendwie nicht passt dann musst du in den einzelnen "arg"'s zusammsetzten oder du schreibst deinen CMD Line um. Das sieht dann so aus: PROGRAMM "C:\Meine Quelle.txt" "C:\Mein Resultat.txt"

    arg[0] = Pfad von deiner EXE Datei
    arg[1] = C:\Meine Quelle.txt
    arg[2] = C:\Mein Resultat.txt

    Vielleicht hilfts ja



  • soulbug schrieb:

    1. Verwende AnsiString's die sind deutlich einfacher

    Die Richtung stimmt, aber bitte std::string aus dem Standard-Header <string> verwenden.



  • ich denke dein problem ist jenes, dass deine CMD Line (also in deinem Fall: C:\Quelle.txt C:\Resultat.txt) Leerzeichen enthält.

    Denn sobald dein ein Leerzeichen vorhanden (z.b C:\hallo du da.txt) ist schaut das Ganze so aus:

    arg[0] = Pfad von deiner EXE Datei
    arg[1] = C:\hallo
    arg[2] = du
    arg[3] = da.txt

    so solls doch aber auch sein

    C:\Quelle.txt C:\Resultat.txt

    ^argv[1]......... ^argv[2]

    demnach soll er argv[1] als Quelldatei einlesen und argv[2] als Ziel 🙂

    oder hab ich dich jetzt falsch verstanden? 🙄



  • Offensichtlich, denn Du bekommst ein Beispiel mit Leerzeichen im Dateinamen und wendest es auf ein Beispiel ohne Leerzeichen im Dateinamen an 😉

    Was passiert denn, wenn Du die Datei "C:\Hallo du da.txt" nach "D:\hier her" (ohne Anführungszeichen zu benutzen) kopieren willst? Richtig: argc == 6. Das ist nicht was Du möchtest.



  • LordJaxom schrieb:

    Offensichtlich, denn Du bekommst ein Beispiel mit Leerzeichen im Dateinamen und wendest es auf ein Beispiel ohne Leerzeichen im Dateinamen an 😉

    Was passiert denn, wenn Du die Datei "C:\Hallo du da.txt" nach "D:\hier her" (ohne Anführungszeichen zu benutzen) kopieren willst? Richtig: argc == 6. Das ist nicht was Du möchtest.

    mein Beispiel hat doch Leerzeichen 😉 zwischen 1.und 2. Argument 😮



  • IN EINEM Dateinamen, nicht ZWISCHEN ZWEI Dateinamen 😡



  • schon klar :p

    //Edit:

    soweit bin ich jetzt

    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <stdio.h>
    
    using namespace std;
    
    int main(int argc, char** argv)
    {
    
    	string line;
    	if (argc != 3)return -1;
    
        FILE *in, *out;
    
    	in = fopen (argv[1], "r");
        out = fopen (argv[2], "w");
    
        if (!in || !out)return -1;
    
    	while(!fgets(line, 1000 ,in))
    
    	fputs(line, out);
    
    	fclose (in);
    	fclose (out);
    
    	return 0;
    }
    

    Mir gefällt daran nicht, dass

    1. bei fgets eine Zeilenlänge angegeben werden muss, mag aber keine haben 🙄

    2. es nicht geht 😡

    gibts ne andere Variante?



  • myFile.open schrieb:

    gibts ne andere Variante?

    Öhm, wie wäre es mit der C++-Variante dieses Programms?
    (std::fstream & std::getline())



  • Willst du uns verarschen? Guck dir vllt. mal die 1. Seite an ... da stehen 2 Lösungsvorschläge?!



  • (D)Evil schrieb:

    Willst du uns verarschen? Guck dir vllt. mal die 1. Seite an ... da stehen 2 Lösungsvorschläge?!

    etwa

    out << in.rdbuf();
    

    ? Ich seh dabei leider keinen Effekt 😕

    Aber danke für den äußerst freundlichen Hinweis!

    Wie gesagt, bin kein Programmierer, aber naja..

    --------------------------------------

    (std::fstream & std::getline())
    

    Mit "getline" hats bei mir nicht funktioniert, aber muss ja nicht unbedingt an der Fuktion liegen 🙄

    Danke The-Kenny



  • myFile.open schrieb:

    Mit "getline" hats bei mir nicht funktioniert, aber muss ja nicht unbedingt an der Fuktion liegen 🙄

    Na herzlichen Dank für diese ausführliche Fehlerbeschreibung 😉 Jetzt weiß hier wirklich jeder, was du falsch gemacht hast 😃 *scnr*



  • Was ist mit der Lösung von Ajaw?
    Nicht nur eine Zeile rauskopieren und irgendwo einsetzen.
    Sondern komplett übernehmen!



  • Airdamn schrieb:

    Was ist mit der Lösung von Ajaw?
    Nicht nur eine Zeile rauskopieren und irgendwo einsetzen.
    Sondern komplett übernehmen!

    der Quellcode von Ajaw scheint ja zu funktionieren, aber soll er nicht eigentlich die Daten aus dem "in"-File ins "out"-File schreiben?

    und wegen getline: da steht immer Bezeichner fehlt



  • myFile.open schrieb:

    Airdamn schrieb:

    Was ist mit der Lösung von Ajaw?
    Nicht nur eine Zeile rauskopieren und irgendwo einsetzen.
    Sondern komplett übernehmen!

    der Quellcode von Ajaw scheint ja zu funktionieren, aber soll er nicht eigentlich die Daten aus dem "in"-File ins "out"-File schreiben?

    Macht er das etwa nicht? Was macht er sonst?

    und wegen getline: da steht immer Bezeichner fehlt

    Hast du alle nötigen Header eingebunden? (in deinem letzten Code fehlt zumindest die <string>)



  • jaa, der string-include ist wieder drin, ist mir auch schon aufgefallen

    aber wenn ich jetzt den code hier habe

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int main(int argc, char** argv)
    {
    
    	if (argc != 3) return -1;
    
        ifstream in(argv[1]);
        ofstream out(argv[2]);
    
        if ((!in.is_open()) || (!out.is_open())) {
            return -1;
        }
    
        out << in.rdbuf();
    
    	out.close();
    
    	return 0;
    }
    

    Müsste er doch alles aus "in" nach "out" übergeben, oder?
    Tut er aber nicht 😕



  • Eigentlich sollte er - hast du das Programm mal durch den Debugger gejagt? (btw, und übergibst du überhaupt gültige Dateinamen?)


Anmelden zum Antworten