M
ENDLICH !!! Mein Gott diese Fehler! DIESE FEHLER !!! Ich bin in C++ ganz schön eingerostet. Bestimmt geht vieles Einfacher als ich Denke. Jedenfalls funktioniert der Code jetzt Tadellos. Ich mach drei Kreuze!
Code ohne Remarks:
#include <fstream>
using namespace std;
bool fileread(istream& is, char* s, streamsize n);
bool filegetline(istream& is, string& s, char delim = '\n');
int main()
{
ifstream datei_lesen;
ofstream datei_ergebnis;
fstream datei_wahlfrei;
int zeile=5;
int zeilen=0;
int neuwert=99;
struct strdaten
{
int x1;
int x2;
int x3;
} daten;
unsigned long strdatensize=sizeof(strdaten);
string gettext;
string gettemp;
int position;
int position2;
int anzahl;
///// Datenstätze in Binär umwandeln
datei_lesen.open("daten.txt",ios_base::in);
if(!datei_lesen.is_open()) exit(1);
datei_wahlfrei.open("binaer.bin",ios_base::in|ios_base::out|ios_base::binary|ios_base::trunc);
if (!datei_wahlfrei.is_open()) exit(2);
while (filegetline(datei_lesen,gettext))
{
position=gettext.find(";",0);
anzahl=position;
gettemp = gettext.substr(0,anzahl);
daten.x1 = atoi(gettemp.c_str());
position++;
position2=gettext.find(";",position);
anzahl=position2-position;
gettemp = gettext.substr(position,anzahl);
daten.x2 = atoi(gettemp.c_str());
position=position2+1;
position2=gettext.find("\n",position);
anzahl=position2-position;
gettemp = gettext.substr(position,anzahl);
daten.x3 = atoi(gettemp.c_str());
datei_wahlfrei.write((char *) &daten, strdatensize);
zeilen+=1;
}
datei_lesen.close();
///// In zeile Wert von x1 ändern
if(zeile>zeilen) exit(4);
datei_wahlfrei.seekg(zeile*strdatensize,ios_base::beg);
datei_wahlfrei.read((char *) &daten, strdatensize);
daten.x1=neuwert;
datei_wahlfrei.seekp(-strdatensize,ios_base::cur);
datei_wahlfrei.write((char *) &daten, strdatensize);
datei_wahlfrei.seekg(0,ios_base::beg);
///// Datensätze in Ascii umwandeln
datei_ergebnis.open("ergebnis.txt",ios_base::out|ios_base::trunc);
if(!datei_ergebnis.is_open()) exit(3);
while (fileread(datei_wahlfrei,(char *) &daten,strdatensize))
{
datei_ergebnis << daten.x1 << ";" << daten.x2 << ";" << daten.x3 << "\n";
}
datei_wahlfrei.close();
datei_ergebnis.close();
return 0;
}
bool fileread(istream& is, char* s, streamsize n)
{
is.read(s,n);
if(is.good()) return true;
is.clear();
return false;
}
bool filegetline(istream& is, string& s, char delim)
{
getline(is,s,delim);
if(is.good()) return true;
is.clear();
return false;
}
// Die Datei daten.txt muss folgendermaßen aufgebaut sein:
//
// z.B.:
// 12;4;0
// 99;1;99
// Drei ganzzahlen, getrennt mit Semikollon
// Jede Zeile muss mit einem Return abgeschlossen sein.
// Sie können natürlich das Format von ihrer Datei im Quelltext anpassen.
Code mit Remarks:
//#include <iostream>
#include <fstream>
//#include <string>
//#include <sstream>
//#include <istream>
//#include <cstdlib>
using namespace std;
bool fileread(istream& is, char* s, streamsize n); // Binär lesen
bool filegetline(istream& is, string& s, char delim = '\n'); // Ascii lesen
int main()
{
ifstream datei_lesen; // <- In diesem Beispiel eine Textdatei, nur diese eine Datei muss
ofstream datei_ergebnis; // vorhanden sein, sonst funktioniert dieses Beispielprogramm nicht. Siehe unten für weitere Infos.
fstream datei_wahlfrei;
int zeile=5; // "Da wo" der Wert geändert werden soll
int zeilen=0; // Zählt die gelesenen Zeilen
int neuwert=99; // Der neue Wert
struct strdaten // die Daten
{
int x1;
int x2;
int x3;
} daten;
// Tuning, bemerkbar nur bei sehr großen Dateien.
unsigned long strdatensize=sizeof(strdaten); // Speicher die Größe von strdaten, wird zum Binären Schreiben und Lesen benötigt
// Benötigt um die Ascii Datei an daten zu übergeben
string gettext; // Enthält eine komplette Zeile von daten.txt
string gettemp; // Enthält den gewünschten Bereich einer Zeile
int position; // Speichert die Position
int position2; // Speichert die Position
int anzahl; // Speichert die Anzahl der Stellen der Zahl
///// Datenstätze in Binär umwandeln
datei_lesen.open("daten.txt",ios_base::in); // Datei daten.txt zum lesen öffnen.
if(!datei_lesen.is_open()) exit(1); // Programm beenden, wenn die Datei nicht offen ist.
datei_wahlfrei.open("binaer.bin",ios_base::in|ios_base::out|ios_base::binary|ios_base::trunc); // Datei binaer.txt zum lesen und schreiben im binär Modus öffnen. Existierende Datei wird gelöscht und neu angelegt. Nicht existierentende Datei wird neu angelegt.
if (!datei_wahlfrei.is_open()) exit(2); // Programm beenden, wenn die Datei nicht offen ist.
while (filegetline(datei_lesen,gettext)) // Schleife wird so oft wiederholt, bis Dateiende erreicht.
{
// Daten ins gewünschte Format umwandeln und daten.x1-x3 übergeben
position=gettext.find(";",0); // Finde das erste Vorkommen von ";"
anzahl=position; // Ergebnis ist die Anzahl der Stellen der ersten Zahl
gettemp = gettext.substr(0,anzahl); // Kopiere den gewünschten Berich in den String
daten.x1 = atoi(gettemp.c_str()); // Wandle den String als int um und übergebe ihn x1 von daten
position++; // Position nach ersten ";" setzen
position2=gettext.find(";",position); // Finde das erste Vorkommen von ";" ab position
anzahl=position2-position; // Ergebnis ist die Anzahl der Stellen der zweiten Zahl
gettemp = gettext.substr(position,anzahl); //
daten.x2 = atoi(gettemp.c_str()); //
position=position2+1; // Position nach zweiten ";" setzen
position2=gettext.find("\n",position); // Finde das erste Vorkommen von "\n" ab position
anzahl=position2-position; // Ergebnis ist die Anzahl der Stellen der dritten Zahl
gettemp = gettext.substr(position,anzahl); //
daten.x3 = atoi(gettemp.c_str()); //
// Ende der Umwandlung für eine Zeile
datei_wahlfrei.write((char *) &daten, strdatensize); // Eine Zeile daten binär in Datei binaer.txt Speichern
zeilen+=1; // Zählt Anzahl der Zeilen
}
//datei_lesen.clear(); // Nur zur Info, wenn die Datei
//datei_lesen.seekg(0,ios_base::beg); // weiter benutzt werden soll
datei_lesen.close(); // Datei daten.txt schliessen
///// In zeile Wert von x1 ändern
// Zur Sicherheit
if(zeile>zeilen) exit(4); // Programm wird beendet, wenn die Zeile nicht existiert
datei_wahlfrei.seekg(zeile*strdatensize,ios_base::beg); // Gehe zur gewünschten Zeile zum Lesen vom Anfang aus
datei_wahlfrei.read((char *) &daten, strdatensize); // Lese gewünschte Zeile aus und speicher in daten
daten.x1=neuwert; // Gib daten.x1 einen anderen Wert
datei_wahlfrei.seekp(-strdatensize,ios_base::cur); // Gehe eine Zeile zurück zum Schreiben
datei_wahlfrei.write((char *) &daten, strdatensize); // Überschreibe die Zeile mit dem neuen daten
datei_wahlfrei.seekg(0,ios_base::beg); // Springe zum Anfang, egal ob mit seekg oder seekp
///// Datensätze in Ascii umwandeln
datei_ergebnis.open("ergebnis.txt",ios_base::out|ios_base::trunc); // Öffne Datei ergebnis.txt zum Schreiben. Nicht existierende werden neu angelegt, existierende überschrieben.
if(!datei_ergebnis.is_open()) exit(3); // Wenn ergebnis.txt nicht offen, Programm beenden
while (fileread(datei_wahlfrei,(char *) &daten,strdatensize)) // Lese Zeile für Zeile bis zum Ende
{
datei_ergebnis << daten.x1 << ";" << daten.x2 << ";" << daten.x3 << "\n"; // Schreibe daten in ergebnis.txt
}
//datei_wahlfrei.clear(); // Nur zur Info, wenn die Datei
//datei_wahlfrei.seekg(0,ios_base::beg); // weiter benutzt werden soll
datei_wahlfrei.close(); // Schliesse binaer.txt
datei_ergebnis.close(); // Schliesse ergebnis.txt
return 0; // Programm Ende
}
bool fileread(istream& is, char* s, streamsize n) // Binär lesen
{
is.read(s,n);
if(is.good()) return true; // Wenn der Datenstrom in Ordnung ist wird ein true zurückgegeben
is.clear(); // Fehlerhaften Datenstrom zurücksetzen
return false;
}
bool filegetline(istream& is, string& s, char delim) // Ascii lesen
{
getline(is,s,delim);
if(is.good()) return true; // Wenn der Datenstrom in Ordnung ist wird ein true zurückgegeben
is.clear(); // Fehlerhaften Datenstrom zurücksetzen
return false;
}
// Die Datei daten.txt muss folgendermaßen aufgebaut sein:
//
// z.B.:
// 12;4;0
// 99;1;99
// Drei ganzzahlen, getrennt mit Semikollon
// Jede Zeile muss mit einem Return abgeschlossen sein.
// Sie können natürlich das Format von ihrer Datei im Quelltext anpassen.
Die daten.txt:
13;41;3
23;12;16
12;32;30
49;3;18
34;12;14
24;36;23
30;13;36
44;23;4
31;44;6
49;5;39