J
Hallo werner
Ich danke dir fuer die erklaerungen und den zur aufgabenstellung perfekt funktionierenden code.
Leider war ich schon soweit in "meinen" code, dass ich die cout.txt auch nur nach diesen kriterien dargestellt habe. Vor dem ent, sowie nach den koodinaten und nach dem ziel string koennen wahllos random strings und zahlen stehen.
Dank deiner hilfe konnte ich die selbstgestellte aufgabe dennoch loesen.
Mit viel es nicht einfach dein code zu interpretieren und die startpage suche gab gerade mal 3 seiten zu .ignore aus. Ich haette es gerne auch auf deinen weg versucht. Ev kannst du ja ein kommentar abgeben ob die dein code so richtig verstanden habe.
hier meine loesung aufgwertet durch deinen code
cplusnet.cpp
#include <iostream>
#include <string>
#include <tuple>
#include <limits> // numeric_limits<>
#include <vector>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <streambuf>
#include <sstream> // String-Ein-/Ausgabe
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <fstream>
using namespace std;
int main()
{
size_t suchepoint;
size_t pos;
int position;
istringstream strin;
istringstream strin2;
string line;
double zahlx;
double zahly;
//1te enlossschleife liest datei immer wieder neu ein
for(;;) // forever !?
{
fstream myfile("cout.txt"); //erzeugt den datei-einleseloop
if( !myfile.is_open() ) // beim Lesen immer prüfen, ob die Datei auch vorhanden bzw. offen ist.
{
cerr << "Fehler beim Oeffnen der Datei" << endl;
return 0; // exit oder continue??
}
//2te "fuer immer" schleife
for(;;)
{
getline (myfile,line); // Lese eine Zeile
//gehoert wohl zur endloschleife
if( myfile.fail() )
break;
//wenn "point" in der zeile ist
suchepoint = line.find("point");
pos = line.find("pos(");
if(suchepoint==string::npos)
continue;
//anfang bis koordinatenbeginn
line.erase(line.begin(),line.begin()+pos+4);
//17 weil 2x7stelligezahl+2vorzeichen+1 leerzeichen
line.erase(line.begin()+17,line.end());
if(position = line.find(" ") == 0 )
{
// loeche erstes leezeichen
line.erase(0,1);
}
//liefert die posi wo der sting gerade ist leerzeichen
position = line.find(" ");
// sting in double umwandeln
strin.str(line); // Streaminhalt mit String-Variable füllen
strin >> zahlx; // ganzzahlige Variable von Eingabe-Stream einlesen
std::cout << zahlx << std::endl; // Zahlx ausgeben
//return zahlx;
//loecht bis zum y wertleerzeichen und das leerzeichen+1
line.erase(line.begin(),line.begin()+position+1);
strin2.str(line); // Streaminhalt mit String-Variable füllen
strin2 >> zahly; // ganzzahlige Variable von Eingabe-Stream einlesen
std::cout << zahly << std::endl; // Zahly ausgeben
//return zahlx;
}// 2te for(;;) schleife
if( myfile.eof() )
cout << "alles Ok; Datei bis zum Ende gelesen" << endl;
//datei schliessen
myfile.close();
//datei neu oeffnen mit schreibrechten
ofstream myfile1;
myfile1.open ("cout.txt");
//beliebiger wert zum ueberschreiben der datei
int var1 = 10;
//file wird ueberschrieben und geschlossen(freigegeben)
myfile << var1 << ' ';
myfile1.close();
//wartezeit
sleep(1); //zu langsam aber gut zum testen
//usleep(100000);//0.1sekunden geht ab
}//1te (for(;;) // forever !?) schleife
return 0;
}//main funktion zu
cout.txt
Lorem ipsum dolor sit amet, t *(*())*(uyam ent( 9).37 2569.41 134.60)Lorem consetetur sadipscing e(*((())litre magna aliquyam circle
ent( 312) pos( 1088.00 432.00 152.00) Lorem ipsum dolor sit amet, consetetur sadit ut labore et dolore magna aliquyam
abore et dolore magna ent( 9) pos( 803.37 2569.41 134.60) Lorem point ipsum dolor sit amet, con circle Lorem ipsum dolor sit amet, con
Lorem ipsum dolor sit amet, consetetur sadipscing elitr,e magna aliquyam ent( 160) pos( 1328.00 440.00 208.00) abore et (42 )dolore magna point abore et dolore magna
ent( 2) pos( 795.55 1937.19 130.09) circle
test
()()
Lorem ipsum dolor sit amet, con(5)(6)(7)(8)(9)(9)
Lorem ipsum ()() ent( 139) pos( 1200.03 480.34 113.72) Lorem ipsum dolor sit amet, con quader Lorem ipsum dolor sit amet, con
Lorem ipsum dolor sit amet, con ent( 5) pos( 632.08 2076.48 197.85) Lorem ipsum dolor sit amet, con ()(78) point
ausgabe
major@major:~/g++$ g++ cplusnet.cpp -w --std=gnu++11 -lSDL2 -lSDL2_image -o ccplusnet
major@major:~/g++$ ./ccplusnet
803.37
2569.41
1328
440
632.08
2076.48
alles Ok; Datei bis zum Ende gelesen
alles Ok; Datei bis zum Ende gelesen
alles Ok; Datei bis zum Ende gelesen
^C
major@major:~/g++$
wenn man nun daten in die txt kopiert und speichert werden diese ausgelesen, angezeigt und geloescht
nochmal vielen dank fuer die hilfe
habe ich dein code richtig verstanden ?
#include <iostream>
#include <fstream>
#include <string>
#include <tuple>
#include <limits> // numeric_limits<>
#include <vector>
int main()
{
using namespace std;
//sowas wie ein array speichert 2 werte in tulpe[0]
vector< tuple< double, double > > allePunktKoordinaten; // hier sollen die Koordinaten reinkommen
//erzeugt den dateieinleseloop
for(;;) // forever !?
{
fstream myfile("cout.txt");
if( !myfile.is_open() ) // beim Lesen immer prüfen, ob die Datei auch vorhanden bzw. offen ist.
{
cerr << "Fehler beim Oeffnen der Datei" << endl;
return 0; // exit oder continue??
}
//definiert ALLES als jedmoeglichen string oder zahl art
auto const ALLES = numeric_limits< streamsize >::max();
for(;;)
{
myfile.ignore( ALLES, ')' ); // bis "ent( zahl )
myfile.ignore( ALLES, '(' ); // bis "ent( zahl ) pos(
double zahlx, zahly;
myfile >> zahlx >> zahly; // liest bis "ent( zahl ) pos( x y
myfile.ignore( ALLES, ')' ); // ... bis "ent( zahl ) pos( x y zahl )
string typ;
myfile >> typ;
//warum sorgt das dafuer, dass die schleife nie endet?
if( myfile.fail() )
break; // Lesen zu Ende
//falls point ungleich typ ist geht zu naechsten zeile
if( typ != "point" )
continue; // zur nächste Zeile
//ausgabe
cout << zahlx << "\n" << zahly << endl; // auf Standard-Ausgabe ausgeben
allePunktKoordinaten.push_back( make_tuple( zahlx, zahly ) ); // Koordinate merken
}
//gib die anzahl der gespeicherten koordinaten aus
cout << allePunktKoordinaten.size() << " Koordinaten mit point gelesen" << endl;
if( myfile.eof() )
cout << "alles Ok; Datei bis zum Ende gelesen" << endl;
// -- Datei löschen
// mit System-Aufruf
// hier ggf. eine Wartezeit einfügen!
}
return 0;
}
mfg