mikrocontroller.net

Forum: PC-Programmierung c++ speicher, lesen, bearbeiten, suchen


Autor: karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

ich habe folgendes problem in der schule sollen wir ein programm für 
eine bauteil sammlung schreiben inder man bauteile eingeben, auslesen, 
bearbeiten und suchen kann. ich speicher meine eingabe als txt, nur 
jetzt weiß ich nicht wie ich diese txt bearbeiten kann oder einzelne 
bauteile aus der txt aufrufen kann.

mfg karl

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
karl wrote:
> Hallo
>
> ich habe folgendes problem in der schule sollen wir ein programm für
> eine bauteil sammlung schreiben inder man bauteile eingeben, auslesen,
> bearbeiten und suchen kann. ich speicher meine eingabe als txt

Du speicherst sie also als Strings.

Aber: Wo speicherst du sie?
In einem Array, einer Liste, einer Hashtable, einer Datenbank, ...?

Je nachdem, wie der Aufbau der Datenstruktur ist, hat man
andere Möglichkeiten. Datenbank lassen wir mal aussen vor,
also wirst du ja die Daten in irgendeiner Form im Speicher
haben.

PS: Es hilft ungemein, wenn du die Programmiersprache bekannt
gibst.

Autor: karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich benutzt c++.
bin noch zimlicherneuling welche struktur ich verwende ist egal kannst 
du mir eine empfehlen. die daten speicher ich in einem ordner bei der 
.exe in einer txt datei.

mfg karl

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
karl wrote:
> ich benutzt c++.
> bin noch zimlicherneuling welche struktur ich verwende ist egal kannst
> du mir eine empfehlen. die daten speicher ich in einem ordner bei der
> .exe in einer txt datei.

Vergiss mal die Datei. Die ist dein geringstes (oder größtes) Problem
und zur Zeit völlig unwichtig.

Da das ein Schulbeispiel ist, ist es völlig ausreichend, wenn
du zunächst mal die Daten im Speicher hältst und darauf operieren
kannst.

Da das ein Schulbeispiel ist gehe ich auch mal davon aus, daß
das keine Hyper-Duper-Super-Ultra-Anwendung werden muss und das
simpelste und einfachste gerade gut genug ist.
Nimm also ein Array und speichere dort deine Daten.

Also fängst du mal damit an, dir eine Klasse zu schreiben,
die ein Bauteil beschreibt.
Was macht ein Bauteil aus. Ich mach mal einen Vorschlag:
Bauteilnummer, Hersteller, Beschreibung
All das werden wohl Strings sein. Der Datentyp std::string ist
dafür ideal
class Bauteil
{
  public:
    // Konstruktoren
    Bauteil();
    Bauteil( const std::string& Nummer,
             const std::string& Hersteller,
             const std::string& Beschreibung );

    void Nummer( const std::string& Arg )       { Nummer_ = Arg; }
    void Hersteller( const std::string& Arg )   { Hersteller_ = Arg; }
    void Beschreibung( const std::string& Arg ) { Beschreibung_ = Arg; }

    std::string Nummer()       { return Nummer_; }
    std::string Hersteller()   { return Hersteller_; }
    std::string Beschreibung() { return Beschreibung_; }

  private:
    std::string Nummer_;
    std::string Hersteller_;
    std::string Beschreibung_;
};

Super, ein einziges Bauteil lässt sich schon mal beschreiben
(die Konstruktoren musst du noch fertig schreiben)

Da ist doch gleich mal ein Testprogramm angesagt:
int main()
{
  Bauteil Test;
  std::string In;

  std::cout << "Enter Nummer: ";
  std::getline( std::cin, In );
  Test.Nummer( In );

  std::cout << "Enter Producer: ";
  std::getline( std::cin, In );
  Test.Hersteller( In );

  std::cout << "Enter Description: ";
  std::getline( std::cin, In );
  Test.Beschreibung( In );

  std::cout << std::endl;
  std::cout << "Bauteil:\n";
  std::cout << "  Nummer:      " << Test.Nummer() << "\n";
  std::cout << "  Producer:    " << Test.Hersteller() << "\n";
  std::cout << "  Description: " << Test.Beschreibung() << "\n";
}

Damit kann man schon mal die Daten für einen Bauteil eingeben.
Die Daten werden in dem Bauteil Objekt Test gespeichert und
zur Kontrolle wieder ausgegeben.

So weit, so gut.
Jetzt will man aber nicht nur 1 Bauteil, sondern viele davon.
Diese müssen irgendwo gespeichert werden. Dafür erfinden wir
gleich mal eine Klasse:
class Database
{
};

Die Klasse braucht eine Speicherfläche. Irgendeine Datenstruktur
die es ermöglicht mehrere Bauteile darin zu speichern. Der Einfach-
heit halber, nehmen wir mal ein Array dafür her. Da wir in
C++ arbeiten, nehmen wir gleich mal was vernünftiges: einen std::vector
Der kümmert sich selber um die Speicherverwaltung sodaß wir hier
nicht viel Arbeit damit haben:
class Database
{

  private:
    std::vector<Bauteil> Data_;
};

Ein paar Funktionen für so eine Datenbasis wären nicht schlecht.
Was muss so eine Datenbasis den alles können. Na zb. hinzufügen,
bzw. ihren Inhalt ausgeben.
class Database
{
  public:

    void Add( Bauteil Neu )    { Data_.push_back( Neu ); }
    void Dump();

  private:
    std::vector<Bauteil> Data_;
};

void Database::Dump()
{
  for( size_t i = 0; i < Data_.size(); ++i ) {
    std::cout << "  Nummer:      " << Data_[i].Nummer() << "\n";
    std::cout << "  Producer:    " << Data_[i].Hersteller() << "\n";
    std::cout << "  Description: " << Data_[i].Beschreibung() << "\n";
    std::cout << "*****************************************\n";
  }
}

(Eigentlich sollte das Ausgeben eines Bauteils die Bauteilklasse
selbst machen. Schliesslich geht es ja die Datenbasis nichts an,
woraus so ein Bauteil besteht)

Dazu brauchen wir gleich wieder mal ein Testprogramm.
Das soll schon sowas wie ein kleiner Menü haben.
2 Menüpunkt: Hinzufügen und Ausgeben. Wird die Funktion
Hinzuügen ausgewählt, dann werden die Daten abgefragt und
ein neues Bauteil zur Datenbasis hinzugefügt.
Beim Menüpunkt Ausgeben, wir die Datenbasis einfach nur
aufgefordert ihren Inhalt auszugeben.

void Add( Database& db )
{
  Bauteil Neues;
  std::string In;

  std::cout << "Enter Nummer:      ";
  std::getline( std::cin, In );
  Neues.Nummer( In );

  std::cout << "Enter Producer:    ";
  std::getline( std::cin, In );
  Neues.Hersteller( In );

  std::cout << "Enter Description: ";
  std::getline( std::cin, In );
  Neues.Beschreibung( In );

  db.Add( Neues );
}

int main()
{
  std::string tmp;
  int Auswahl;
  Database Data;

  do {
    std::cout << "\n";
    std::cout << "1) Hinzufügen\n";
    std::cout << "2) Ausgeben\n";
    std::cout << "9) Exit\n\n";

    std::cout << "Ihre Wahl: ";
    std::cin >> Auswahl;
    std::getline( std::cin, tmp );   // um den \n wegzukriegen

    if( Auswahl == 1 )
      Add( Data );

    else if( Auswahl == 2 )
      Data.Dump();

  } while( Auswahl != 9 );
}

Ich gebe jetzt an dich ab. Ab hier müsst ihr weitermachen.
Denn schliesslich ist es eure Hausaufgabe und nicht meine.

Autor: karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich haber aber jetzt noch ein problem ich muss die daten in einer txt 
datei ausgeben und auch nochmal bearbeiten können. wie kann ich in einer 
bestimmten position in einer txt etwas überschreiben bzw. löschen und 
dann neuschreiben ohne den rest zulöschen oder zu überschreiben.
mfg karl

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
karl wrote:
> ich haber aber jetzt noch ein problem ich muss die daten in einer txt
> datei ausgeben und auch nochmal bearbeiten können. wie kann ich in einer
> bestimmten position in einer txt etwas überschreiben bzw. löschen und
> dann neuschreiben ohne den rest zulöschen oder zu überschreiben.

Gar nicht.

Eine Textdatei kann nur als Ganzes neu geschrieben werden.
Man kann einzelne Character ersetzen, das wars aber dann auch
schon. Wenn sich nur ein Text um 1 Zeichen verlängert, muss
das ganze File neu geschrieben werden.

Bist du denn schon soweit, dass du dich um das File kümmern
musst?

Das ist im übrigen ganz einfach: Wenn das Programm hochfährt,
wird der Fileinhalt in die interne Speicher-Datenbasis
übernommen, dort finden dann alle Manipulationen statt
und bei Programmende wird der Speicherinhalt wieder auf
die (neue) Datei geschrieben.

Steht denn in deiner Hausaufgabe explizit, dass du die
Daten nicht im Speicher halten darfst und jede Veränderung
sofort im File gemacht werden muss?
Wenn nein: Dann mach das auch nicht. Das verkompliziert die
Sache nur ungemein.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Solltest du alles direkt auf die Platte nageln müssen, denk am besten 
drüber nach, für jedes Bauteil eine eigene Datei anzulegen.

Autor: karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gibt es keine möglichkeit das anderes zuspeichern z.B. andere datei oder 
andere befehle?? ich benötige auf jeden fall eine datei auf der platte.
mfg karl

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
karl wrote:
> gibt es keine möglichkeit das anderes zuspeichern z.B. andere datei oder
> andere befehle?? ich benötige auf jeden fall eine datei auf der platte.

Ja, macht ja nichts.
Du kannst doch deinen Speicherinhalt jederzeit in eine Datei
auf die Platte schreiben. Ist doch kein Problem.

Mir scheint, du konzentriest dich da jetzt auf ein im Moment
völlig unwichtiges Detail. Du hängst dich da jetzt auf einem
File auf, als hinge dein Leben davon ab.

Kannst du schon Bauteile aufnehmen? Kannst du schon Bauteile suchen?
Kannst du schon Bauteile ändern? Kannst du schon Bauteile drucken?
Kannst du schon Bauteile löschen?

Alles das geht am einfachsten, wenn du die kompletten Daten
aller Bauteile im Speicher hast (zb in einem Array).
Dieses Array von einem File laden, bzw. dieses Array wieder
in ein File zurückschreiben ist ja nicht das große Problem.


Ich klink mich jetzt aus. Ich habe das Gefühl gegen eine
Wand zu reden.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.