tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
5
ZUGRIFFE
785
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    alwin2210 alwin2210 ist offline Grünschnabel
    Registriert seit
    Aug 2007
    Beiträge
    3
    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

    Meine Ausgangsdatei sieht folgendermaßen aus:

    1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEFGHIJKLMNOPQR STUVWXYZ

    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    
    //  *****************************************************
    //  * 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
     

  2. #2
    cesupa cesupa ist offline Mitglied Brokat
    Registriert seit
    Sep 2004
    Beiträge
    329
    Hast du es schon mit der Funktion atoi() versucht?

    Gruß
    cesupa
     

  3. #3
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von cesupa Beitrag anzeigen
    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:
    Code cpp:
    1
    2
    3
    4
    5
    
    int limit;
     
    if (argc >= 3 && sscanf(argv[2], "%d", &limit) == 1) {
      printf("trenne Zeilen ab %d Zeichen.\n", limit);
    }
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  4. #4
    alwin2210 alwin2210 ist offline Grünschnabel
    Registriert seit
    Aug 2007
    Beiträge
    3
    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

    Code :
    1
    
        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
     

  5. #5
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von alwin2210 Beitrag anzeigen
    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...

    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    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:
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    
    istringstream arg3(argv[3]);
    unsigned int i;
     
    if (arg3 >> i) {
      /* OK: arg3 war ein unsigned int */
      ...
    }
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  6. #6
    alwin2210 alwin2210 ist offline Grünschnabel
    Registriert seit
    Aug 2007
    Beiträge
    3
    Super. Danke, die Überprüfung klappt wunderbar.

    Gruß
    Alex
     

Ähnliche Themen

  1. Typenumwandlung in Logo
    Von Gems 4 im Forum Sonstige Sprachen
    Antworten: 3
    Letzter Beitrag: 16.09.08, 18:32
  2. timestamp und typenumwandlung
    Von soeni1987 im Forum C/C++
    Antworten: 8
    Letzter Beitrag: 26.11.07, 00:37
  3. Typenumwandlung (Int, String, Cahr[])
    Von Bizkit im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 16.03.07, 08:41
  4. Typenumwandlung / Stringverknüpfungen
    Von gl4di4t0r im Forum C/C++
    Antworten: 6
    Letzter Beitrag: 21.09.05, 06:55
  5. Typenumwandlung bei C++
    Von Splint123 im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 08.10.04, 16:37