# .txt Datei einlesen, Inhalt trennen und einzeln speichern



## Mahatmas (7. September 2007)

Hallo zusammen, bin neu hier und hab da auch gleich einmal ein Problem...

Ich will mit C++ (blutiger Anfänger) eine .txt-Datei einlesen und sie in verschieden Felder speichern.

Der Text hat folgende Struktur:

Funktionswort1 <tab> Text <tab> anderer Text <return>
Funktionswort2 <tab> wieder anderer Text <tab> und nochmal Text <tab> schon wieder <return>
Funkrionswort3 <tab> ...
...

d.h. ich brauch jeden durch <tab> getrennten Teil in einem extra Array, muss aber erkennen wann es ein Funktionswort ist und welcher Text zu diesem Funktionswort gehört (also jeder Text in der Zeile zu dem dazugehörigen Funktionswort)

Wär super, wenn mir da jemand weiterhelfen kann...


----------



## Dorschty (7. September 2007)

Hi,
heißt das du willst für jede Zeile eine extra .txt Datei oder wie soll ich das verstehen?

Gruß
Dorschty


----------



## Mahatmas (7. September 2007)

nein,

ich habe die .txt-Datei, die diesen Aufbau hat.
Ich will diese einlesen. Die eingelesenen "Blöcke" dann in einzelnen Feldern speichern, damit ich die dann weiter verarbeiten kann.

Wichtig nur, dass eine Zeile immer zusammenhängend ist, also immer ein "Funktionswert" am Anfang und danach durch Tabs getrennt mehrere Texte in der Zeile.


----------



## Mahatmas (7. September 2007)

natürlich "Funktionswort"


----------



## Dorschty (7. September 2007)

Dann leg dir doch einfach ein string array an, lies den Text in das array mit fscanf oder fgets so, das du zB in deinem array text[0] dann dein "Funktionswort"; text[1] dann Text usw.
Wie man die Datei öffnet weißt du

Gruß
Dorschty


----------



## deepthroat (7. September 2007)

Hi.

Das kannst du relativ einfach mit der getline Funktion machen. Bsp:


```
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>

using namespace std;

int main()
{
   ifstream fin("test.txt");

   if (fin.is_open())
     {
        string line;

        while(getline(fin, line))
          {
             istringstream sin(line);

             string fword;
             if (getline(sin, fword, '\t')) 
               {
                  cout << fword << endl;
               }
          }
     }
   else
     {
        cerr << "could not open file." << endl;
     }
}
```
Gruß


----------



## Mahatmas (7. September 2007)

Ich hab sie mit fopen geöffnet, weiß nur nicht, ob dass dann so funktioniert.

FILE *ptr;
ptr = fopen("Test.txt", "w+");

Wenn ich dann: printf( "%s\n", *ptr ); mach, gibt der mir immer [null] aus...

Mit string array hab ich auch noch ein Problem. Hab zwar #include <string.h> gemacht, aber er meckert, dass er string nicht kennt.
Hättest du da vielleicht ein kleines Bsp.? Wär super...
Danke im vorraus.

gruß
Flo


----------



## Dorschty (7. September 2007)

Das er dir immer [null] anzeigt ist kein Wunder, da er die Datei nicht öffnen kann und der Rückgabewert dafür ist eben Null. Ich vermute du hast deine .txt im falschen Ordner! Mach doch einfach ein #define PATH "den kompletten Pfad zur Datei" und öffne es mit:

if((ptr=fopen(PATH,"r"))==NULL)
{
...
}
else
{
printf("Kann Datei nicht oeffnen");
}

für das Problem mit dem String... füge unter deinen includes und defines ein:
using namespace std;
und versuchs nochmal! Dann müsste es gehen.

Gruß
Dorschty


----------



## Dorschty (7. September 2007)

Noch was! Du solltest die Datei auf keinen Fall mit "w+" öffnen, da sonst der Inhalt der Datei gelöscht wird! Wenn du nur lesen willst öffne sie mit "r".

Gruß
Dorschty


----------



## Mahatmas (7. September 2007)

So erstmal vielen Dank!

Das klappt jetzt erstmal soweit, zumindestens Einlesen, das Problem mit "string" behoben. Bastel jetzt mal weiter. Seh nur, dass ich jetzt noch das Problem habe, dass ich bei der Version von "deepthroat" zwar die "Funktionswörter" abfangen kann, aber dann die hinteren Zeilenteile noch zusammen stehen. Mal schauen...

Danke...

Flo


----------



## Imod (8. September 2007)

könnt ihr mir mal bitte helfen :

Treadlink:

http://www.tutorials.de/forum/c-c/287597-txt-datei-einlesen-und-anzeigen.html

wäre super nett

Mfg Domi


----------



## Imod (8. September 2007)

sorry dass ich nochmal schireb hab den code nochmal editiert mit einer else kausel.
Dec C++ bringt keinen Fehler aber durch die else kausel ahb ich erfaren das er die "add.txt" nicht öffnen kann.

Hier der neue code:


```
cout <<"\n";
  if ( menu == 2)
  {
  FILE* fp;
  if (fp = fopen("add.txt", "r")) //lesen
  { 
  gets(cText);   //liest string bis zum zeilenende
  cout << cText;
  while(!(feof(fp)))   // bis datei zu ende ist
  {
    gets(cText);   //liest string bis zum zeilenende
    cout << cText ;
  }
  }
  else
  {
  cout << "\n";  
  cout << "\n";  
  cout << " can not open file !! \n";
  cout << "\n";
  }      
  }
  cout << "\n";
```


----------



## Imod (8. September 2007)

sorry flascher tread *peinlich

tut mir echt leid


----------



## Mahatmas (10. September 2007)

Moin Moin,

zurück zu meinem Problem 

Wie kann ich die weiteren Parameter hinter den "Funktionswörtern" voneinander  trennen und ebenfalls in eigene Arrays abspeichern.

Hab das mit einzelnen If-Abfragen gelöst, so wie am Anfang mit den "Funktionswörtern". Also immer wieder das erste Wort rausgelesen, doch da brauch ich ja ewig viele Schleifen und Variablen und das ist ja nicht der Sinn der Sache...

Irgendwie mit ner WHILE-Schleife hab ich zwar probiert, bekomm es aber leider nicht hin.

Wär super wenn mir da nochmal einer helfen könnte. Sag schon mal Danke für eure Mühen.

mfg

Flo


----------



## Dorschty (10. September 2007)

Warum willst du denn alles in einzelnen arrays speichern?
Wenn du sowieso strings einliest, kannst du doch entweder für jedes Wort eine string variable anlegen oder wenn net, liest du einfach eine Zeile in ein array, so das du zB in deinem array[0] dann dein Funktionswort, im array[1]  deinen Text usw. 
Das könntest du dann einfach in einer while Schleife lösen.

Gruß
Dorschty


----------



## deepthroat (10. September 2007)

Hi.





Mahatmas hat gesagt.:


> Irgendwie mit ner WHILE-Schleife hab ich zwar probiert, bekomm es aber leider nicht hin.


Im Grunde mußt du doch nur das *if* durch *while* ersetzen und dann natürlich entsprechend die Werte verarbeiten:
	
	
	



```
/* 1) Funktionswort auslesen */
...

/* 2) restliche Werte auslesen */
string value;

while (getline(sin, value, '\t')) {
  /* value verarbeiten ... */
}
```
Gruß


----------



## Mahatmas (10. September 2007)

oh mann,
wie einfach eigentlich...

Danke!

so, Problem behoben...
Meld mich bestimmt bald wieder 

Flo


----------

