PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Brauche Hilfe bei Mini C++ Programm


Joe
2004-09-10, 17:23:48
Hallo ich hab folgendes Problem:
Ich hab 0 Ahnung vom Programmieren.
Hab grad angefangen C++ zu lernen und es ist sehr schleppend nun soll ich aber für die liebe Verwandschafft was kleines Schreiben aber ich bin noch lang nicht soweit, obwohl es wirklich sehr sehr simpel ist:

Also ich hab einen Ordner in dem ist eine *.txt Datei.
Die Txt Datein haben pro zeile 80-120 Zeichen sieht etwa so aus:

110001+00001226 21.322+18552650 32..12+0000345
110001+00001226 21.322+18552650 32..12+0000345
110001+00001226 21.322+18552650 32..12+0000345
110001+00001226 21.322+18552650 32..12+0000345

Nun kommt eine Exe in den ordner bei ausführung soll sie die textdatei auslesen, eine neue anders benannte txt erstellen, aus dem string bestimmte stellen herauskopieren und mit gleicher Formatierung in der neuen txt speichern also etwa so

00001226 18552650
00001226 18552650
00001226 18552650
00001226 18552650

Es sit wirklich sehr wichtig das das am Montag läuft und ich hab den verdacht, das ich dem nicht gewachsen bin. Je mehr ich in meinem Taschenbuch blätter, deste komplizierter wirds :(

Hoffe ihr könnt mir aus der Patsche helfen.

Gnafoo
2004-09-10, 19:31:30
sollte kein Problem sein ..

sind die Daten, die rauskopiert werden sollen immer an der gleichen Stelle einer Zeile, oder sind die irgendwie durch die '+' und spaces etc getrennt und evtl. auch an anderer Stelle ?

Wenn du die txt-Datei mal hochladen könntest, kann ichs mir evtl. heute Abend noch kurz anschauen. Aber verprechen kann ich dir nichts :D Morgen bin ich den ganzen Tag weg.

cya DerTod

Joe
2004-09-10, 19:37:42
für den neueinsteiger isses ein gewalltiges Problem :D
die daten sind in jeder zeile an der gleichen stelle

also zb immer stelle 19-34 und 54-112
ich hab die datei noch nicht, krieg sie aber heute abend :)

Gnafoo
2004-09-10, 20:06:06
#include <fstream>
#include <string>
#include <iostream>
#include <cassert>
using namespace std;

// felder
const int feld1_start = 18;
const int feld1_len = 15;
const int feld2_start = 53;
const int feld2_len = 58;

int main(int argc, char* argv[])
{
if(argc!=3)
{
cout << argv[0] << ": [Quelldatei] [Zieldatei]" << endl;
return(1);
}

// dateien öffnen
ifstream input(argv[1]);
ofstream output(argv[2]);

if((!input.is_open()) || (!output.is_open()))
{
cerr << "Eine oder beide Dateien konnten nicht geöffnet werden." << endl;
input.close(); output.close();
return(1);
}

while(input.good()&&output.good())
{
// nächste zeile einlesen
string line;
getline(input, line);
if(line=="") break;

assert(line.length()>=feld2_start+feld2_len+1);

// felder extrahieren
string feld1 = line.substr(feld1_start, feld1_len);
string feld2 = line.substr(feld2_start, feld2_len);

// felder in neue datei schreiben
output << feld1 << " " << feld2 << endl;
}

// dateien schließen
output.close();
input.close();

return(0);
}


Ganz oben mit feld1_start, feld1_len, feld2_start und feld2_len kann man die Felderpositionen festlegen. (Erster Buchstabe in Zeile ist 0)
Das ganze dann kompilieren und in der Eingabeaufforderung starten mit:

convert [quelldatei] [zieldatei]

je nachdem wie die Exe heißt :D

Das Programm sollte sich beklagen, wenn eine Datei nicht geöffnet werden kann und wenn Zeilen zu kurz sind gibt es einen Assertion failure.
Ich hoffe das hilft dir weiter.

cu DerTod

Trap
2004-09-10, 20:15:15
Schöne Musterlösung :)

Joe
2004-09-11, 12:35:14
Linker-Vorgang läuft...
LIBCD.lib(wincrt0.obj) : error LNK2001: Nichtaufgeloestes externes Symbol _WinMain@16
Debug/Vermessungport.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise

:| Ich muss wirklich dumm sein....

liquid
2004-09-11, 17:11:39
:| Ich muss wirklich dumm sein....

Du musst den src als Konsoleanwendung übersetzen.

cya
liquid

Joe
2004-09-11, 20:16:30
??? nun hab ich die gewissheit das ihc dumm bin :D

Xmas
2004-09-11, 21:07:49
Welchen Compiler verwendest du?

Joe
2004-09-11, 21:14:32
Visual C++ 6.0

Xmas
2004-09-11, 21:35:34
Dann erstellst du einfach ein neues, leeres Projekt als "Win32 Konsolenanwendung", legst darin eine neue Quellcode-Datei an (.cpp) und kopierst den Code von Der Tod dort rein. Dann sollte es laufen.

Joe
2004-09-12, 18:21:59
So danke erstmal
hab das programm etwas erweitert auf meine bedürfnisse.
So läufts abern ich und ich weis nich warum....


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

// felder
const int feld1_start = 7;
const int feld1_len = 8;
const int feld2_start = 23;
const int feld2_len = 8;
const int feld3_start = 39;
const int feld3_len = 8;
const int feld4_start = 54;
const int feld4_len = 9;
const int feld5_start = 70;
const int feld5_len = 9;
const int feld6_start = 86;
const int feld6_len = 9;
const int feld7_start = 110;
const int feld7_len = 2;
const int feld8_start = 120;
const int feld8_len = 8;

int main(int argc, char* argv[])
{
if(argc!=3)
{
cout << argv[0] << ": [Quelldatei] [Zieldatei]" << endl;
return(1);
}

// dateien öffnen
ifstream input(argv[1]);
ofstream output(argv[2]);

if((!input.is_open()) || (!output.is_open()))
{
cerr << "Eine oder beide Dateien konnten nicht geöffnet werden." << endl;
input.close(); output.close();
return(1);
}

while(input.good()&&output.good())
{
// nächste zeile einlesen
string line;
getline(input, line);
if(line=="") break;

assert(line.length()>=feld8_start+feld8_len+1);

// felder extrahieren
string feld1 = line.substr(feld1_start, feld1_len);
string feld2 = line.substr(feld2_start, feld2_len);
string feld3 = line.substr(feld3_start, feld3_len);
string feld4 = line.substr(feld4_start, feld4_len);
string feld5 = line.substr(feld5_start, feld5_len);
string feld6 = line.substr(feld6_start, feld6_len);
string feld7 = line.substr(feld7_start, feld7_len);
string feld8 = line.substr(feld8_start, feld8_len);

// felder in neue datei schreiben
output << feld1 << " " << feld2 << " " << feld3 << " " << feld4 << " " << feld5 << " " << feld6 << " " << feld7 << " " << feld8 << endl;
}

// dateien schließen
output.close();
input.close();

return 0;
}


Es muss etwas mit der Definition der Zeilenlänge zu tun haben

Xmas
2004-09-12, 19:24:42
"Es läuft nicht" ist eine unzureichende Fehlerbeschreibung.

Joe
2004-09-12, 20:19:02
Assertion failed: line.length<>>=feld8_start+feld8_len+1

Gnafoo
2004-09-12, 21:12:16
Dann muss wohl eine Zeile so kurz sein, dass nicht alle Felder drin vorkommen können.
Zumindest nicht, wenn ich mich nicht vertan habe.

füg doch einmal statt dem assert ein:

if(line.length()<feld8_start+feld8_len+1)
{
cout << line.c_str() << endl;
}


das sollte dir die betroffene Zeile ausspucken.
Leerzeilen werden ja gefiltert, zumindest wenn dort keine spaces etc. drin sind.

cya DerTod