Anzeige:
Ergebnis 1 bis 14 von 14

Thema: [c++] Arbeiten mit Datenströmen und Dateien

  1. #1
    Registrierter Benutzer Avatar von Berufspenner
    Registriert seit
    30.03.2002
    Ort
    Hamburg
    Beiträge
    567

    Question [c++] Arbeiten mit Datenströmen und Dateien

    Hi@all

    Ich möchte ein Programm Eingaben formatiert in eine Textdatei schreiben lassen. Im Stil einer Tabelle. Desweiteren möchte ich in dieser Datei suchen können und die komplette Zeile, in der sich das Suchergebnis befindet ausgeben lassen bzw. jede Spalte dieser Zeile in einer Variable speichern. Desweiteren möchte ich komplette Zeilen löschen und wenn möglich auch einzellne Spalten einer Zeile ändern. Das ganze soll am besten systemunabhängig laufen.

    Jetzt meine Fragen: Gibt es da bestimmte Standardfunktionen? Gibt es eine Möglichkeit auch eine Tabelle zu nehemen (keine komplette Datenbank)? Wenn nicht, wie löse ich das Problem mit der passenden Formatierung, dem finden von Inhalt, das Ausgeben der kompletten Zeille und das Ändern eines "Spalteninhalts"?
    Wahrscheinlich lassen sich einige Sachen recht simple lösen, dennoch frag ich lieber noch mal nach.

    Cu
    André
    C und C++

  2. #2
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665

    Re: [c++] Arbeiten mit Datenströmen und Dateien

    Original geschrieben von Berufspenner
    Hi@all

    Ich möchte ein Programm Eingaben formatiert in eine Textdatei schreiben lassen. Im Stil einer Tabelle. Desweiteren möchte ich in dieser Datei suchen können und die komplette Zeile, in der sich das Suchergebnis befindet ausgeben lassen bzw. jede Spalte dieser Zeile in einer Variable speichern. Desweiteren möchte ich komplette Zeilen löschen und wenn möglich auch einzellne Spalten einer Zeile ändern. Das ganze soll am besten systemunabhängig laufen.

    Jetzt meine Fragen: Gibt es da bestimmte Standardfunktionen? Gibt es eine Möglichkeit auch eine Tabelle zu nehemen (keine komplette Datenbank)? Wenn nicht, wie löse ich das Problem mit der passenden Formatierung, dem finden von Inhalt, das Ausgeben der kompletten Zeille und das Ändern eines "Spalteninhalts"?
    Wahrscheinlich lassen sich einige Sachen recht simple lösen, dennoch frag ich lieber noch mal nach.

    Cu
    André
    Auf Anhieb fällt mir da keine Tabellen-Funktion für sowas ein...

    Haben alle Zeilen gleich viele Spalten?
    Soll es möglich sein die Spaltenanzahl des Inhalts im Nachhinein beliebig zu verändern?

    Um in den einzelnen Zeilen einen Text zu suchen, lies die Datei doch mit getline ein und durchsuch dann deren Inhalt - zum Trennen in verschiedene Spalten würde ich strtok (http://www.cplusplus.com/ref/cstring/strtok.html) benutzen und als Trennzeichen für die Spalten z.B. '\t'. Die einfachste Möglichkeit um z.b. einzelne Zeilen zu löschen ist eine Klasse mit Kettenstruktur - eine Instanz für jede Zeile z.b....

    Ansonsten habe ich gerade die Idee einfach ein Komplettes Array 1:1 in eine Datei zu schreiben und noch die Breite und Höhe des Arrays mit in der Datei zu speichern, z.B. in der 1. Zeile, die dann ntürlich nicht mit zum Array gehört

  3. #3
    Registrierter Benutzer Avatar von Berufspenner
    Registriert seit
    30.03.2002
    Ort
    Hamburg
    Beiträge
    567
    Hi
    Haben alle Zeilen gleich viele Spalten?
    Ja
    Soll es möglich sein die Spaltenanzahl des Inhalts im Nachhinein beliebig zu verändern?
    Die Spaltenanzahl bleibt immer konstant. Nur auf den Inhalt einer Spalte in einer Zeile soll zugegriffen werden können und gegebenen Falls verändert werden können. Auf Anhieb würde mir da jetzt ein zweidimensionalles Array einfallen. Ob das so klappt weis ich aber nicht.
    Um in den einzelnen Zeilen einen Text zu suchen, lies die Datei doch mit getline ein und durchsuch dann deren Inhalt - zum Trennen in verschiedene Spalten würde ich strtok (http://www.cplusplus.com/ref/cstring/strtok.html) benutzen und als Trennzeichen für die Spalten z.B. '\t'. Die einfachste Möglichkeit um z.b. einzelne Zeilen zu löschen ist eine Klasse mit Kettenstruktur - eine Instanz für jede Zeile z.b....
    Hört sich gut an. Wer ich mir mal angucken.
    Ansonsten habe ich gerade die Idee einfach ein Komplettes Array 1:1 in eine Datei zu schreiben und noch die Breite und Höhe des Arrays mit in der Datei zu speichern, z.B. in der 1. Zeile, die dann ntürlich nicht mit zum Array gehört
    Ja, ein Array. Nur hab ich keine Vorstellung davon, wie ich das in eine Datei bringe

    Cu
    André
    C und C++

  4. #4
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    Original geschrieben von Berufspenner
    Ja, ein Array. Nur hab ich keine Vorstellung davon, wie ich das in eine Datei bringe
    Mit Hilfe eines Zeigers byteweise aus dem Speicher auslesen und in eine Datei schreiben - ich werde mal ausprobieren, ob das so geht

  5. #5
    Registrierter Benutzer Avatar von Berufspenner
    Registriert seit
    30.03.2002
    Ort
    Hamburg
    Beiträge
    567
    Original geschrieben von BLUESCREEN3D
    Mit Hilfe eines Zeigers byteweise aus dem Speicher auslesen und in eine Datei schreiben - ich werde mal ausprobieren, ob das so geht
    Das wäre super

    Cu
    André
    C und C++

  6. #6
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Was sind denn deine Spalteninhalte?

    Gibt es Zeichen, die man als Trennzeichen benutzen kann, d.h. die nicht in einem Spalteninhalt vorkommen können?

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  7. #7
    Registrierter Benutzer Avatar von Berufspenner
    Registriert seit
    30.03.2002
    Ort
    Hamburg
    Beiträge
    567
    Original geschrieben von anda_skoa
    Was sind denn deine Spalteninhalte?

    Gibt es Zeichen, die man als Trennzeichen benutzen kann, d.h. die nicht in einem Spalteninhalt vorkommen können?

    Ciao,
    _
    Also als Spalteninhalt sind Strings und unsigned int bwz. unsigned long (Namen, Nummern, Kommentare, etc.) gedacht.

    Cu
    André
    C und C++

  8. #8
    Registrierter Benutzer Avatar von DanDanger
    Registriert seit
    15.12.2001
    Ort
    /home/dandanger
    Beiträge
    130
    Hi,

    Für "Formatierte" Ausgaben (Tabellen, etc.), eignet sich unter C++ die <iomanip>-Bibliothek aus der STD.

    Du Übergibst dem AusgabeStream einfach die erforderlichen Parameter, z.B :

    Code:
    #include <iomanip>
    
    using namespace std ;
    
    (.....)
    
    /*
    Formatierte Tabelle :
    Linksbündige Ausrichtung, jede Spalte 10 Felder Breit, Leerzeichen werden mit '*' aufgefüllt.
    */
    cout << setiosflags(ios::left) << width(10) << setfill("*") << DATEN_ZUM_AUSGEBEN << endl ;
    Gruss
    DanDanger

    PS: In den manpagen ("man iomanip" ) stehen natürlich noch mehr Ausgabe-Flags und Möglichleiten zur Formatierung. Da iomanip aus der STD ist, ist es 100%ig Standartkonform.
    ------------------------------------
    DanDanger

  9. #9
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    @dandanger: das ist unsinnig, wenn das ganze in eine datei geschrieben wird, da ist es dann umso schwere das ganze wieder auszulesen...

    ich habe das mal ausprobiert, indem ich einfach eine zeile in der datei pro zelle in der tabelle genommen habe:

    array_write.cpp:
    Code:
    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    struct eine_zeile
    	{
    	string ein_string;
    	int ein_int;
    	long ein_long;
    	};
    
    int main()
    	{
    	int y;
    	int zeilen;
    	ofstream datei;
    	string tmp;
    
    	cout << "Zeilen: ";
    	cin >> zeilen;
    	cout << endl;
    
    	getline(cin,tmp);	//Buffer leeren - geht bestimmt mit irgendeinem anderen Befehl besser =)
    	
    	struct eine_zeile eingaben[zeilen];
    
    	for(y=0;y<zeilen;y++)
    		{
    		cout << endl << "Zeile " << y+1 << ":" << endl;
    
    		cout << "ein_string: ";
    		getline(cin,eingaben[y].ein_string);
    		cout << "ein_int: ";
    		cin >> eingaben[y].ein_int;
    		cout << "ein_long: ";
    		cin >> eingaben[y].ein_long;
    
    		getline(cin,tmp);	//Buffer leeren - geht bestimmt mit irgendeinem anderen Befehl besser =)
    		}
    
    	cout << endl;
    	cout << "Speichere Array..." << endl;
    	cout << "Zeilen: " << zeilen << endl;
    	cout << "sizeof(array): " << sizeof(eingaben) << endl;
    
    	datei.open("array");
    	datei << zeilen << endl;
    	for(y=0;y<zeilen;y++)
    		{
    		datei << eingaben[y].ein_string << endl;
    		datei << eingaben[y].ein_int << endl;
    		datei << eingaben[y].ein_long << endl;
    		}
    	datei.close();
    	}
    und zum auslesen:
    array_read.cpp:
    Code:
    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    struct eine_zeile
    	{
    	string ein_string;
    	int ein_int;
    	long ein_long;
    	};
    
    int main()
    	{
    	int y;
    	int zeilen;
    	ifstream datei;
    
    	cout << "Lese Array...";
    	
    	datei.open("array");
    	datei >> zeilen;
    	cout << "Zeilen: " << zeilen << endl;
    	
    	struct eine_zeile eingaben[zeilen];
    
    	cout << "sizeof(array): " << sizeof(eingaben) << endl;
    
    	for(y=0;y<zeilen;y++)
    		{
    		cout << endl << "Zeile " << y+1 << ":" << endl;
    
    		datei >> eingaben[y].ein_string;
    		cout << "ein_string: " << eingaben[y].ein_string << endl;
    		datei >> eingaben[y].ein_int;
    		cout << "ein_int: " << eingaben[y].ein_int << endl;
    		datei >> eingaben[y].ein_long;
    		cout << "ein_long: " << eingaben[y].ein_long << endl;
    		}
    	datei.close();
    	}

  10. #10
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Den Namen würde ich auf jeden Fall mit getline lesen, denn ad kann potentiell immer ein Leerzeichn vorkommen.

    Es stimmt zwar, dass eine formatierte Datei mit mehreren Splaten pro Zeile maschinell aufwendiger zu lesen ist, dafür ist es für einen Menschen leichter.

    Wenn der einizige String in der Zeile ein Name ist, könnte man , ; # etc als Trennzeichen benutzen.

    Die Funktion, die einen Textzeile dann in die Teile aufspaltet kann ja in der Klasse implementiert werden, die so eine Daten Zeile beinhaltet.

    Theoretisch könnte man sogar den Stream operator >> überladen.

    Je nach erwarteter Datenmenge ist es vielleicht besser, für den normalen Gebrauch eine binäre Repräsentation zu wählen und nur bei Bedarf nach/von Text exportieren/importieren.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  11. #11
    Registrierter Benutzer Avatar von Berufspenner
    Registriert seit
    30.03.2002
    Ort
    Hamburg
    Beiträge
    567
    Hi@all

    Ersteinmal vielen Danke für die ganzen Antworten und Codepostings. Ich werde nachher in aller Ruhe mir mal BLUESCREEN3D's Code zu Gemüte führen.
    Nochmals, vielen Dank.

    Cu
    André
    C und C++

  12. #12
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    ich hab schon wieder ne bessere Idee

    man könnte statt meines eindimensionalen struct-Arrays ein 2-Dimensionales union-Array benutzen

  13. #13
    Registrierter Benutzer Avatar von Berufspenner
    Registriert seit
    30.03.2002
    Ort
    Hamburg
    Beiträge
    567
    Original geschrieben von BLUESCREEN3D
    ich hab schon wieder ne bessere Idee

    man könnte statt meines eindimensionalen struct-Arrays ein 2-Dimensionales union-Array benutzen
    Laß einfach deiner Kreativität freien Lauf

    Cu
    André
    C und C++

  14. #14
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    Original geschrieben von Berufspenner
    Laß einfach deiner Kreativität freien Lauf
    hmm... nö , die Idee ist doch nicht so gut

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •