ERLEDIGT
JA
JA
ANTWORTEN
5
5
ZUGRIFFE
785
785
EMPFEHLEN
-
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
-
Hast du es schon mit der Funktion atoi() versucht?
Gruß
cesupa
-
21.08.07 21:04 #3
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.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:Gruß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); }
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Danke für die schnellen Anworten.
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 stehenZitat von cesupa
Hast du es schon mit der Funktion atoi() versucht?
Code :1
konvertieren(argv[1], argv[2], atoi(argv[3]));
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.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:
An welcher Stelle müsste ich denn die sscanf-Funktion einbauen? Ein kurzer Hint würde mir denke ich reichen.
Danke nochmal.
Gruß
Alex
-
22.08.07 11:30 #5
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.Und ich dachte den kurzen Hinweis hätte ich schon gegeben...
Du kannst es übrigens im C++ Stil mit einem istringstream konvertieren: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(...); }
Gruß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 */ ... }
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Super. Danke, die Überprüfung klappt wunderbar.
Gruß
Alex
Ähnliche Themen
-
Typenumwandlung in Logo
Von Gems 4 im Forum Sonstige SprachenAntworten: 3Letzter Beitrag: 16.09.08, 18:32 -
timestamp und typenumwandlung
Von soeni1987 im Forum C/C++Antworten: 8Letzter Beitrag: 26.11.07, 00:37 -
Typenumwandlung (Int, String, Cahr[])
Von Bizkit im Forum C/C++Antworten: 1Letzter Beitrag: 16.03.07, 08:41 -
Typenumwandlung / Stringverknüpfungen
Von gl4di4t0r im Forum C/C++Antworten: 6Letzter Beitrag: 21.09.05, 06:55 -
Typenumwandlung bei C++
Von Splint123 im Forum C/C++Antworten: 4Letzter Beitrag: 08.10.04, 16:37





Zitieren

Login






