Guten Abend allerseits,
ich bin derzeit im 2. Semester Informatik und habe derzeit ein kleines Problem mit fstream.
Gefordert ist, dass ein Vector, welcher mit Strings gefüllt ist beim Aufruf des Programms aus einer Binärdatei eingelesen und am Ende des Programms wieder in selbige Datei abgespeichert werden soll.
Klar ist mir, dass sich Strings nicht ohne weiteres in eine Binärdatei abspeichern lassen, da sonst bei reinem einspeichern in die Datei letzten Endes nicht wiedererkannt werden kann, welche Länge der bestimmte String besitzt welchen man laden möchte.
Vorgehensweise ist hierbei nun, dass man in die Binärdatei zuerst die Länge des Strings abspeichert und darauf folgend den String selbst, so führt man das in einer Schleife fort, bist der Vector komplett abgespeichert wurde/die Binärdatei am EOF angelangt ist, je nachdem ob man einlesen oder abspeichern möchte.
Problematisch wird es bei mir nun bei der Umsetzung, ich habe recherchiert und versucht etwas dazu hinzubekommen.
Mein Code um es etwas zu veranschaulichen:
main.cpp
Navigation.cpp
Navigation.h
So habe ich mir das gedacht, zuerst wird mit dem ersten read() die Länge des Strings als Integer geladen, dann wird diese Länge im darauffolgenden read() als Länge der zu lesenden Zeichen genommen.
Nach dem read() kommt irgendwann auch das write(), alles wie im Code dargestellt scheint der Compiler nicht zu bemängeln und führt alles auch super aus, wenn ich nun aber das Programm schließe und wieder öffne sind aber nun keine Strings eingelesen worden und auch in der Datei sind keine Werte abgespeichert worden, kann mir jemand helfen und sagen wo genau hierbei der Fehler liegt?
Ja, der Vector in der Klasse Ort sollte private sein, habe das zur Vereinfachung aber nun weggelassen.
Hoffe mein Problem ist verständlich! Falls nicht gerne nochmals drauf ansprechen, ich hoffe ihr könnt mir helfen!
Mit freundlichen Grüßen
Max
ich bin derzeit im 2. Semester Informatik und habe derzeit ein kleines Problem mit fstream.
Gefordert ist, dass ein Vector, welcher mit Strings gefüllt ist beim Aufruf des Programms aus einer Binärdatei eingelesen und am Ende des Programms wieder in selbige Datei abgespeichert werden soll.
Klar ist mir, dass sich Strings nicht ohne weiteres in eine Binärdatei abspeichern lassen, da sonst bei reinem einspeichern in die Datei letzten Endes nicht wiedererkannt werden kann, welche Länge der bestimmte String besitzt welchen man laden möchte.
Vorgehensweise ist hierbei nun, dass man in die Binärdatei zuerst die Länge des Strings abspeichert und darauf folgend den String selbst, so führt man das in einer Schleife fort, bist der Vector komplett abgespeichert wurde/die Binärdatei am EOF angelangt ist, je nachdem ob man einlesen oder abspeichern möchte.
Problematisch wird es bei mir nun bei der Umsetzung, ich habe recherchiert und versucht etwas dazu hinzubekommen.
Mein Code um es etwas zu veranschaulichen:
main.cpp
C++:
#include <cstdlib>
#include <iostream>
#include <vector>
#include <string>
#include "Navigation.h"
#include <fstream>
using namespace std;
/*
*
*/
int main(int argc, char** argv) {
int eingabe = 0;
int counter = 0;
string einlesestring;
Ort navi;
string orteingabe,searchort;
int sizeofstring;
ifstream binary_locations;
binary_locations.open("binary_locations.bin", ios::in | ios::binary);
if(!binary_locations)
cerr << "Binärdatei konnte nicht geöffnet werden!" << endl;
while(!binary_locations.eof()){
counter++;
binary_locations.read((char *)&sizeofstring, sizeof(sizeofstring));
binary_locations.read((char *)&einlesestring, sizeofstring);
navi.orteingabe(einlesestring);
}
binary_locations.close();
while (eingabe != 7) {
cout << "--------Navigationssystem--------" << endl;
cout << "1. Neuen Ort (mit Namen) hinzufügen" << endl;
cout << "2. Ort löschen" << endl;
cout << "3. Neue Namen aus Textdatei einlesen" << endl;
cout << "4. Alle Namen in Textdatei schreiben" << endl;
cout << "5. Alle Namen ausgeben" << endl;
cout << "6. Start- und Zielort eingeben" << endl;
cout << "7. Beenden" << endl;
cin >> eingabe;
if (eingabe > 0 && eingabe < 8) {
switch (eingabe) {
case 1:
cout << "Geben Sie den Ort ein den sie speichern möchten!" << endl;
cin >> orteingabe;
navi.orteingabe(orteingabe);
cout << "Der Ort wurde erfolgreich gespeichert!" << endl;
break;
case 2:
cout << "Geben Sie den Ort ein den sie löschen möchten!" << endl;
cin >> orteingabe;
navi.ortloeschen(orteingabe);
cout << "Der Ort wurde erfolgreich gelöscht!" << endl;
break;
case 3:
cout << "Neue Namen werden aus der Textdatei eingelesen!" << endl;
navi.readTXT();
cout << "Die Namen wurden erfolgreich eingelesen!" << endl;
break;
case 4:
cout << "Alle Namen werden nun in eine Textdatei geschrieben!" << endl;
navi.writeallTXT();
cout << "Alle Namen wurden erfolgreich in eine Textdatei geschrieben" << endl;
break;
case 5:
cout << "Namen der gespeicherten Orte:" << endl;
navi.printall();
break;
case 6:
cout << "Geben Sie den Startort ein!" << endl;
cin >> searchort;
if (!navi.searchort(searchort)) {
cout << "Der eingegebene Startort wurde nicht gefunden!" << endl;
break;
}
cout << "Geben Sie einen Zielort ein!" << endl;
cin >> searchort;
if (!navi.searchort(searchort)) {
cout << "Der eingegebene Zielort wurde nicht gefunden!" << endl;
break;
} else {
cout << "Start und Zielort wurden gefunden!" << endl;
}
break;
}
}
}
ofstream binary_locations_of;
binary_locations.open("binary_locations.bin", ios::out | ios::binary);
if(!binary_locations_of)
cerr << "Binärdatei konnte nicht geöffnet werden!" << endl;
for(int i = 0;i < navi.orte.size();i++){
sizeofstring = navi.orte[i].size();
binary_locations_of.write((char *)&sizeofstring, sizeof(sizeofstring));
binary_locations_of.write((char *)&navi.orte[i], sizeofstring);
}
return 0;
}
Navigation.cpp
C++:
#include "Navigation.h"
#include <fstream>
#include <iostream>
Ort::Ort(){
}
void Ort::orteingabe(const std::string& ortname){
orte.push_back(ortname);
}
void Ort::ortloeschen(const std::string& ortname){
for(int i = 0; orte.size() > i;i++){
if(orte[i] == ortname){
orte.erase(orte.begin() +i );
}
}
}
void Ort::printall(){
for(int i = 0; orte.size() > i;i++){
std::cout << i << ". " << orte[i] << std::endl;
}
}
void Ort::readTXT(){
std::ifstream locations;
std::string ort;
locations.open("Locations.txt", std::ios::in);
if(!locations){
std::cerr << "Datei kann nicht geöffnet werden!" << std::endl;
}
while(getline(locations, ort)){
orte.push_back(ort);
}
locations.close();
}
void Ort::writeallTXT(){
std::ofstream locationswrite;
std::string ort;
locationswrite.open("Locations.txt", std::ios::out);
if(!locationswrite){
std::cerr << "Datei kann nicht geöffnet werden!" << std::endl;
}
for(int i = 0; i < orte.size();i++){
locationswrite << orte[i] << std::endl;
}
locationswrite.close();
}
bool Ort::searchort(const std::string& orteingabe){
bool treffer = false;
for(int i = 0; i < orte.size();i++){
if(orte[i] == orteingabe){
treffer = true;
}
}
return treffer;
}
Ort::~Ort(){
}
Navigation.h
C++:
#ifndef NAVIGATION_H
#define NAVIGATION_H
#include <vector>
#include <string>
class Ort{
public:
Ort();
~Ort();
void orteingabe(const std::string& ortname);
void ortloeschen(const std::string& ortname);
void readTXT();
void writeallTXT();
void printall();
bool searchort(const std::string& orteingabe);
std::vector<std::string> orte;
};
#endif /* NAVIGATION_H */
So habe ich mir das gedacht, zuerst wird mit dem ersten read() die Länge des Strings als Integer geladen, dann wird diese Länge im darauffolgenden read() als Länge der zu lesenden Zeichen genommen.
Nach dem read() kommt irgendwann auch das write(), alles wie im Code dargestellt scheint der Compiler nicht zu bemängeln und führt alles auch super aus, wenn ich nun aber das Programm schließe und wieder öffne sind aber nun keine Strings eingelesen worden und auch in der Datei sind keine Werte abgespeichert worden, kann mir jemand helfen und sagen wo genau hierbei der Fehler liegt?
Ja, der Vector in der Klasse Ort sollte private sein, habe das zur Vereinfachung aber nun weggelassen.
Hoffe mein Problem ist verständlich! Falls nicht gerne nochmals drauf ansprechen, ich hoffe ihr könnt mir helfen!
Mit freundlichen Grüßen
Max
Zuletzt bearbeitet: