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


von karl (Gast)


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

von Karl H. (kbuchegg)


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.

von karl (Gast)


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

von Karl H. (kbuchegg)


Angehängte Dateien:

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
1
class Bauteil
2
{
3
  public:
4
    // Konstruktoren
5
    Bauteil();
6
    Bauteil( const std::string& Nummer,
7
             const std::string& Hersteller,
8
             const std::string& Beschreibung );
9
10
    void Nummer( const std::string& Arg )       { Nummer_ = Arg; }
11
    void Hersteller( const std::string& Arg )   { Hersteller_ = Arg; }
12
    void Beschreibung( const std::string& Arg ) { Beschreibung_ = Arg; }
13
14
    std::string Nummer()       { return Nummer_; }
15
    std::string Hersteller()   { return Hersteller_; }
16
    std::string Beschreibung() { return Beschreibung_; }
17
18
  private:
19
    std::string Nummer_;
20
    std::string Hersteller_;
21
    std::string Beschreibung_;
22
};

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:
1
int main()
2
{
3
  Bauteil Test;
4
  std::string In;
5
6
  std::cout << "Enter Nummer: ";
7
  std::getline( std::cin, In );
8
  Test.Nummer( In );
9
10
  std::cout << "Enter Producer: ";
11
  std::getline( std::cin, In );
12
  Test.Hersteller( In );
13
14
  std::cout << "Enter Description: ";
15
  std::getline( std::cin, In );
16
  Test.Beschreibung( In );
17
18
  std::cout << std::endl;
19
  std::cout << "Bauteil:\n";
20
  std::cout << "  Nummer:      " << Test.Nummer() << "\n";
21
  std::cout << "  Producer:    " << Test.Hersteller() << "\n";
22
  std::cout << "  Description: " << Test.Beschreibung() << "\n";
23
}

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:
1
class Database
2
{
3
};

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:
1
class Database
2
{
3
4
  private:
5
    std::vector<Bauteil> Data_;
6
};

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.
1
class Database
2
{
3
  public:
4
5
    void Add( Bauteil Neu )    { Data_.push_back( Neu ); }
6
    void Dump();
7
8
  private:
9
    std::vector<Bauteil> Data_;
10
};
11
12
void Database::Dump()
13
{
14
  for( size_t i = 0; i < Data_.size(); ++i ) {
15
    std::cout << "  Nummer:      " << Data_[i].Nummer() << "\n";
16
    std::cout << "  Producer:    " << Data_[i].Hersteller() << "\n";
17
    std::cout << "  Description: " << Data_[i].Beschreibung() << "\n";
18
    std::cout << "*****************************************\n";
19
  }
20
}

(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.

1
void Add( Database& db )
2
{
3
  Bauteil Neues;
4
  std::string In;
5
6
  std::cout << "Enter Nummer:      ";
7
  std::getline( std::cin, In );
8
  Neues.Nummer( In );
9
10
  std::cout << "Enter Producer:    ";
11
  std::getline( std::cin, In );
12
  Neues.Hersteller( In );
13
14
  std::cout << "Enter Description: ";
15
  std::getline( std::cin, In );
16
  Neues.Beschreibung( In );
17
18
  db.Add( Neues );
19
}
20
21
int main()
22
{
23
  std::string tmp;
24
  int Auswahl;
25
  Database Data;
26
27
  do {
28
    std::cout << "\n";
29
    std::cout << "1) Hinzufügen\n";
30
    std::cout << "2) Ausgeben\n";
31
    std::cout << "9) Exit\n\n";
32
33
    std::cout << "Ihre Wahl: ";
34
    std::cin >> Auswahl;
35
    std::getline( std::cin, tmp );   // um den \n wegzukriegen
36
37
    if( Auswahl == 1 )
38
      Add( Data );
39
40
    else if( Auswahl == 2 )
41
      Data.Dump();
42
43
  } while( Auswahl != 9 );
44
}

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

von karl (Gast)


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

von Karl H. (kbuchegg)


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.

von Sven P. (Gast)


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.

von karl (Gast)


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

von Karl H. (kbuchegg)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.