Übergabeparameter und Typenumwandlung Dev-C++

alwin2210

Grünschnabel
Hallo zusammen,

ich habe hier eine kleine Nuß, die sich von mir einfach nicht knacken lassen will. Ich hoffe, es hat jemand ein wenig Zeit für mich und kann mal kurz über den Code schauen.

Und zwar muss ich ein Programm schreiben, dass in einer (Text-)Datei nach einer bestimmten Anzahl von Zeichen ein ENTER-Zeichen einfügt. Das Programm (siehe unten) funktioniert in soweit auch, nur bekomme ich die Zeichenlänge, nach der das Zeichen eingefügt werden soll einfach nicht variabel :confused:

Meine Ausgangsdatei sieht folgendermaßen aus:

1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ

Meine Zieldatei dann so:

1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ
1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ
1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ


Das Programm an sich wird über die Commandozeile aufgerufen und bekommt dort auch die Parameter mit:

c:\konvertieren.exe c:\text.txt c:\text_neu.txt 36

Wie bereits gesagt, ist die Zeichenlänge von 36 noch hart im Programm hinterlegt. Ich habe schon versucht, diese als INT übergeben zu lassen, bekomme dabei aber immer eine riesige Zahl raus. Auch eine CHAR nach INT Konvertierung habe ich versucht, bin aber restlos gescheitert.

Da ich seit vielen Jahren nichts mehr in C++ gemacht habe und sich auch viel geändert hat, habe ich mir das Programm aus vielen kleinen Code-Fragmenten aus dem Netz zusammengeschustert. Nun bin ich auf euer Wissen angewiesen.

Hat jemand von euch eine Idee, wie ich das Ganze lösen könnte?


Code:
//  *****************************************************
//  * DIESES PROGRAMM FÜGT NACH EINER BESTIMMTEN        *
//  * ZEICHENLÄNGE EIN ENTER-ZEICHEN IN EINER DATEI EIN *
//  *****************************************************

#include <fstream>
#include <iostream>
using namespace std; 

void konvertieren(char Dateiname[200],char Tempdateiname[200], int Cut)
{   
     //Deklaration der Prozedurvariablen
     long Durchlauefe = 0,
          Zaehler     = 0;

     // Originaldatei öffnen 
	 ifstream iStream(Dateiname);
	 
     // tempomäre Datei erstellen und öffnen     
     ofstream tempStream(Tempdateiname);
	 string Datensatz; 
	 
     // die Zeile in den String laden
	 getline(iStream, Datensatz);
	         
     // Zeichenlänge vom Datensatz und Durchläufe ermitteln
     Durchlauefe     = (Datensatz.length() / Cut) - 1;
        
     // Zeichen einfügen bis maximale Anzahl von Durchläufen erreicht wurde
     while(Zaehler < Durchlauefe)   
      {
       // Zeichen nach bestimmter Zeichenlänge (Cut) einfügen
       Datensatz.insert((Zaehler+1) * Cut + Zaehler,"\n");
       Zaehler = Zaehler + 1;
      }

     // Datensatz zurück in tempomäre Datei schreiben 
     tempStream << Datensatz << endl;	
	 
	 //Dateien schließen
	 iStream.close();    
	 tempStream.close();        
} 


int main( int argc, char * argv[], int laenge)
{       
  system("CLS");

  if ( argc > 4 )
  {
    cout << "\nZu viel Parameter Bitte uebergeben Sie:\n\n";
    cout << "   - den komplettem Dateipfad zu der Originaldatei\n";
    cout << "   - den kompletten Zielpfad der Zieldatei und\n";
    cout << "   - die Zeichenlaenge, nach wievielen Zeichen ein ENTER eingefuegt werden soll!\n\n";
    
    // in argv[0] steht der Pfad der aufgerufenen Datei
    cout << "Erster  Parameter (Originaldatei): \n" << argv[1] << "\n\n";
    cout << "Zweiter Parameter (Zieldatei):     \n" << argv[2] << "\n\n";
    cout << "Dritter Parameter (Zeichen):       \n" << argv[3] << "\n\n";
  }
  else if ( argc < 2 )
  {
    cout << "\nZu wenig Parameter Bitte uebergeben Sie:\n\n";
    cout << "   - den komplettem Dateipfad zu der Originaldatei\n";
    cout << "   - den kompletten Zielpfad der Zieldatei und\n";
    cout << "   - die Zeichenlaenge, nach wievielen Zeichen ein ENTER eingefuegt werden soll!\n\n";
  }
  else
  {
    // in argv[0] steht der Pfad der aufgerufenen Datei
    cout << "Erster  Parameter (Originaldatei): \n" << argv[1] << "\n\n";
    cout << "Zweiter Parameter (Zieldatei):     \n" << argv[2] << "\n\n";
    cout << "Dritter Parameter (Zeichen):       \n" << argv[3] << "\n\n";
    
    // Datei auf Existenz überprüfen
    FILE *fp;   // Datei-Zeiger
    
    if ((fp = fopen(argv[1], "r"))==NULL)
       {
        cout << "\n\nKann Datei \"" << argv[1] <<"\" nicht finden!\n";
        cout << "Bitte ueberpruefen Sie Ihre Eingabe! \n\n\n";
        system("PAUSE");
        exit(1);
       }   
     
    // tempomäre Datei löschen (wenn vorhanden)
    remove(argv[2]);
    
    //Aufruf der Prozedur "konvertieren"    
    konvertieren(argv[1], argv[2], 36);
  }    
    return 0;
}

Vielen Dank schonmal im Voraus
Alex
 
Hi.
Hast du es schon mit der Funktion atoi() versucht?
Die Funktion atoi sollte man allerdings nur verwenden, wenn man sicher ist, das wirklich eine Zahl im String steht da die Funktion keine Fehler erkennt und einfach 0 zurückgibt. Das könnte ein Problem mit dem Einfügen der Newlines geben...

Es geht aber auch relativ einfach mit der sscanf Funktion:
C++:
int limit;

if (argc >= 3 && sscanf(argv[2], "%d", &limit) == 1) {
  printf("trenne Zeilen ab %d Zeichen.\n", limit);
}
Gruß
 
Danke für die schnellen Anworten.

Zitat von cesupa
Hast du es schon mit der Funktion atoi() versucht?

Habe gerade atoi() in den Aufruf der konvertieren-Funktion eingebaut und es funktioniert tadellos. Ich bin der ganzen Zeit der Meinung gewesen, dass ich ein Char benutze, anstatt ein String, obwohl in argv[] ja nur Strings stehen :rolleyes:

Code:
    konvertieren(argv[1], argv[2], atoi(argv[3]));

Zitat vom deepthroat
Die Funktion atoi sollte man allerdings nur verwenden, wenn man sicher ist, das wirklich eine Zahl im String steht da die Funktion keine Fehler erkennt und einfach 0 zurückgibt. Das könnte ein Problem mit dem Einfügen der Newlines geben...

Es geht aber auch relativ einfach mit der sscanf Funktion:

Den Tipp werde ich auch mal ausprobieren. Hab mal, zusammen mit der atoi()-Funktionen, anststatt einer Zahl noch einen 3. String übergeben und das Programm schmiert ab bzw. die 2. Textdatei bleibt leer.

An welcher Stelle müsste ich denn die sscanf-Funktion einbauen? Ein kurzer Hint würde mir denke ich reichen.

Danke nochmal.

Gruß
Alex
 
Hi.
An welcher Stelle müsste ich denn die sscanf-Funktion einbauen? Ein kurzer Hint würde mir denke ich reichen.
Und ich dachte den kurzen Hinweis hätte ich schon gegeben...

C++:
if (argc > 4) {
  ...
} else if (argc < 2) {
  ...
} else if (sscanf(argv[3], "%d", &i) != 1) {
  /* Fehler: in argv[3] stand keine Zahl */
} else {
  konvertieren(...);
}
Du kannst es übrigens im C++ Stil mit einem istringstream konvertieren:
C++:
istringstream arg3(argv[3]);
unsigned int i;

if (arg3 >> i) {
  /* OK: arg3 war ein unsigned int */
  ...
}
Gruß
 
Zurück