Archiv verlassen und diese Seite im Standarddesign anzeigen : Brauche Hilfe bei Mini C++ Programm
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
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
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
??? nun hab ich die gewissheit das ihc dumm bin :D
Welchen Compiler verwendest du?
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.
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
"Es läuft nicht" ist eine unzureichende Fehlerbeschreibung.
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
vBulletin®, Copyright ©2000-2024, Jelsoft Enterprises Ltd.