# Einzelne Zeichen aus .txt in array auslesen, ändern und/oder löschen



## Aschas (9. November 2010)

Heyho Leute,

ich bin neu hier auf der Seite und habe direkt auch schon ein paar Fragen. 


Wie lese ich einzelne Zeichen bis zu einem "," aus einer .txt aus (alles in einer Zeile) und schreibe den Abschnitt dann jeweils in ein Array?

Dann soll man noch die Option haben diese Zeile in der Datei zu löschen und alle weiteren aufrücken zu lassen bzw. ganz einfach zu ändern (also überschreiben).


Ich habe eine weile Pause mit C++ gemacht und werde jetzt direkt mit so einer Aufgabe konfrotiert und das wobei es noch nie meine Stärke war mit Dateien zu arbeiten bei C++ 

Plz help me! 

MfG


----------



## Aschas (9. November 2010)

soo
habe noch ein wenig weiter gesucht und was zusammen gebastelt.

Jetzt die Frage an euch erfahrene Programmier: Ist das so okay?


```
#include <cstdlib>
#include<iostream> 
#include<conio.h>
#include<fstream>
#include<iomanip>
#include<string.h>

using namespace std;
struct leasing
{
	char objnummer[5];
	char objbez[21];
	char kdnummer[5];
	char kdname[21];
	char kdstrasse[21];
	char kdplz[6];
	char kdort[21];
	int lbtag;
	int lbmonat;
	int lbjahr;
	int letag;
	int lemonat;
	int lejahr;
	double rebetrag;
	}database[100];

int main(int argc, char *argv[])
{

}

int Auslesen()
{
    
          
    int i=0;              // Stelle im Array
    int k=0;              // Trennungscounter
    
    
    ifstream f;                            
    string s;

    
    f.open("datenbank.txt", ios::in);   // Öffne Datei aus Parameter
    while (!f.eof())                    // Solange noch Daten vorliegen
    {
 		for (int j=0; j==vnummer; j++)  // Sucht die richtige Zeile
		{ 
          getline(f, s);                // Liest eine Zeile
   
          if (j==vnummer)
          {
             while (k<14)       // Überprüft Stelle auf letzte Abbruchbedingung
             {                               
               switch (k)
               {
                 case 0:
                        if (s[i] != ",")
                        {
                          database[o].objnummer[i] = s[i];              // Schreibt String in Array
                          i++;
                        }
                        else
                        {
                          i++;
                          k++;
                        }
                        break;
                 case 1:
                        if (s[i] != ",")
                        {
                          database[o].objbez[i] = s[i];
                          i++;
                        }
                        else
                        {
                          i++;
                          k++;
                        }
                        break;      
                 case 2:
                        if (s[i] != ",")
                        {
                          database[o].kdnummer[i] = s[i]
                          i++;
                        }
                        else
                        {
                          i++;
                          k++;
                        }
                        break;           
                 case 3:
                        if (s[i] != ",")
                        {
                          database[o].kdname[i] = s[i]
                          i++;
                        }
                        else
                        {
                          i++;
                          k++;
                        }
                        break;
                 case 4:
                        if (s[i] != ",")
                        {
                          database[o].kdstrasse[i] = s[i]
                          i++;
                        }
                        else
                        {
                          i++;
                          k++;
                        }
                        break;    
                 case 5:
                                                     
                        if (s[i] != ",")
                        {
                          database[o].kdplz[i] = s[i]
                          i++;
                        }
                        else
                        {
                          i++;
                          k++;
                        }
                        break;
                 case 6:
                                                     
                        if (s[i] != ",")
                        {
                          database[o].kdort[i] = s[i]
                          i++;
                        }
                        else
                        {
                          i++;
                          k++;
                        }
                        break;
                 case 7:
                                                     
                        if (s[i] != ",")
                        {
                          database[o].lbtag[i] = s[i]
                          i++;
                        }
                        else
                        {
                          i++;
                          k++;
                        }
                        break;
                 case 8:
                                                     
                        if (s[i] != ",")
                        {
                          database[o].lbmonat[i] = s[i]
                          i++;
                        }
                        else
                        {
                          i++;
                          k++;
                        }
                        break;
                 case 9:

                        if (s[i] != ",")
                        {
                          database[o].lbjahr[i] = s[i]
                          i++;
                        }
                        else
                        {
                          i++;
                          k++;
                        }
                        break;
                 case 10:
                                                     
                        if (s[i] != ",")
                        {
                          database[o].letag[i] = s[i]
                          i++;
                        }
                        else
                        {
                          i++;
                          k++;
                        }
                        break;
                 case 11:
                                                     
                        if (s[i] != ",")
                        {
                          database[o].lemonat[i] = s[i]
                          i++;
                        }
                        else
                        {
                          i++;
                          k++;
                        }
                        break;
                 case 12:
                                                     
                        if (s[i] != ",")
                        {
                          database[o].lejahr[i] = s[i]
                          i++;
                        }
                        else
                        {
                          i++;
                          k++;
                        }
                        break;
                 case 13:
                                                     
                        if (s[i] != ",")
                        {
                          database[o].rebevertrag[i] = s[i]
                          i++;
                        }
                        else
                        {
                          i++;
                          k++;
                        }
                        break;
               } 
             }
          }
        }  
    }
    f.close();                          // Datei wieder schließen
}
```


noch zur Info, der Dateiinhalt soll so aussehen:
34565,Beispiel,67394,Horst,Strasse,43926,Ort,15,2,1987,22,5,1995,50,

und das dann in jeder Zeile so in etwa.



Währe echt gut, wenn ihr mir bei den anderen Sachen noch helfen könntet, denn im Gegensatz zu dem hier habe ich bei denen gar keine Ahnung! 


MfG


----------



## Trulleberg (9. November 2010)

Mit simplem C geht dies sehr kurz,


```
typedef struct
{
    char objnummer[5];
    char objbez[21];
    char kdnummer[5];
    char kdname[21];
    char kdstrasse[21];
    char kdplz[6];
    char kdort[21];
    int lbtag;
    int lbmonat;
    int lbjahr;
    int letag;
    int lemonat;
    int lejahr;
    double rebetrag;
    } Leasing;

int main()
{
Leasing d[100];
char zeile[1000];
int i=0;
FILE *f=fopen("datenbank.txt","rt");
if( !f ) exit(1);
while( fgets(zeile,1000,f) )
  if( 14==sscanf(zeile,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%d,%d,%d,%d,%d,%d,%lf",
    d[i].objnummer,
    d[i].objbez,
    d[i].kdnummer,
    d[i].kdname,
    d[i].kdstrasse,
    d[i].kdplz,
    d[i].kdort,
    &d[i].lbtag,
    &d[i].lbmonat,
    &d[i].lbjahr,
    &d[i].letag,
    &d[i].lemonat,
    &d[i].lejahr,
    &d[i].rebetrag) ) ++i;
fclose(f);
printf("\n%d Datensätze wurden gelesen.",i);
return 0; 
}
```


----------



## Aschas (10. November 2010)

ich muss es aber leider in c++ programmieren, aber trotzdem danke für den Versuch 

MfG


----------



## vfl_freak (10. November 2010)

Moin,

jedes C-Programm ist auch ein C++-Programm - sprich: kann unter C++ compiliert werden ....

Gruß
Klaus


----------



## Aschas (10. November 2010)

Ja das ist mir schon klar, allerdings sollen wir reines C++ schreiben und keine Sachen aus C benutzen :/

kann ich leider nicht ändern - anders wäre es mir auch lieber ^^

MfG


----------



## Aschas (10. November 2010)

Ok Doppelposts sind nicht schön, aber ich will ja schließlich das das hier gelesen wird (langsam wird auch die Zeit zum abgeben knapp :/).

Wie Lösche ich eine Zeile aus einer .txt und rücke dann die nachfolgenden auf (und auch entsprechend die arrays, damit das nicht plötzlich 1 2 3 5 6 9 usw. ist)

also ich weiß wie man sie überschreibt, das ist ja auch nicht gerade schwer, aber die Zeile soll ja komplett weg sein.....und den Rest dann im Programm aufschieben damit keine Lücken entstehen habe ich zwar etwas im Kopf, aber noch nicht wirklich den Plan wie ich das auch umsetze.

MfG


----------



## sheel (10. November 2010)

Aschas hat gesagt.:


> Ja das ist mir schon klar, allerdings sollen wir reines C++ schreiben und keine Sachen aus C benutzen :/


 
Das wird schwer...jedes if gibts auch in C, ebenso wie while, switch, struct... 

Und nur weil man printf statt cout und FILE* statt irgendeinem Stream verwendet, bleibt es trotzdem die gleiche Sprache...viele Wege führen nach Rom.


----------



## Aschas (13. November 2010)

hm naja das hat mir nicht wirklich viel gebracht, da viele der Anweisungen im C-Code in C++ für mich einfach mal gar keinen Sinn ergeben. ^^

z.B. diese Zeile:


> if( 14==sscanf(zeile,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%d,%d,%d,%d,%d,%d,%lf",




naja egal - habe den Code den ich oben gepostet hab soweit benutzt, musste ihn nur noch ein wenig modifizieren

bis auf ein paar kleine Anpassungen damit die Funktion ins Hauptprogramm etwas passt, hatte ich nur ein wirklich schweres Problem (für mich).

Undzwar das er bei case 7-13 eine explizite Typumwandlung brauchte, weil er das Zeichen ja als String ausliest aber als Integer speichert um damit später noch weiter zu rechnen im Programm (nicht in der Funktion).

Daran habe ich lange geknobelt, da ich dieses Problem eigendlich noch nie hatte in C++ und bin dann schließlich auf diese Lösung gekommen:

statt

```
case 7:
                                                     
                        if (s[i] != ",")
                        {
                          database[o].lbtag[i] = s[i]
                          i++;
                        }
                        else
                        {
                          i++;
                          k++;
                        }
                        break;
```

habe ich dann 

```
case 7:
                                                     
                        if (s[i] != ",")
                        {
                          ch[i] = s[i];
                          i++;
                        }
                        else
                        {
                          ch[0] = (int)ch;
                          database[o].lbtag = ch[0];
                          i++;
                          k++;
                        }
                        break;
```

Also erst den String in einem Array gesammelt und dieses dann komplett in ein Integer-Array umgewandelt und dieses dann in das End-Array gespeichert. 



Bearbeiten war leicheter als gedacht und dafür brauchte ich eigendlich kein bisschen Hilfe *gähn* ^^ 
Nur beim löschen bin ich irgendwie verzweifelt  Ich bin mir sicher das die Lösung einfach ist, aber ich komme beim besten willen nicht drauf....sicher denke ich wieder viel zu kompliziert^^

MfG


----------

