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.txt1. 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.txtVielleicht 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.txtso 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?)