# *.txt Files Zeilenweise einlesen und in neue *.txt files ausgeben



## philishake (30. Mai 2005)

C++ Compiler und Editor: Visual Studio 6.0 + Service Pack 6
Sprache: NUR C++ ! 

Hi Leute ...

Ich habe mal wieder das Foum nach antworten durchsucht und bin zwa fündig bezüglich meines Problems geworden, aber leider war die Lösungsvariante nicht meinen Anforderungen entsprechend.
Was ich will ist folgendes:
Ein Programm das Eine Text Datei, deren name abgefragt wird, die zum Beispiel so aussieht:
12
25
36
00
07
08
...
Zeilenweise ausliest und den jeweiligen wert berabeitbar macht und anschließen in eine neue Text datei schreibt. Bitte nur in C++ (Windows). Bitte keine Links zu anderen Threats, da ich sie schon so gut wie alle kenne, danke phil


----------



## Tobias K. (30. Mai 2005)

moin


Und wo ist genau das Problem?
Einlesen, auslesen oder das bearbeiten?


mfg
umbrasaxum


----------



## philishake (30. Mai 2005)

"... alle drei zusammen..."


----------



## Tobias K. (30. Mai 2005)

moin


Und nun soll dir jemand ein Programm schreiben, das alle oben erwähnten Anforderungen erfüllt?


mfg
umbrasaxum


----------



## philishake (30. Mai 2005)

das wäre sehr nett  aber bitte übersichtlich  , damit man daran rumbasteln kann


----------



## Tobias K. (30. Mai 2005)

moin


Dann kann ich dir sagen das du hier falsch bist!
Genaue Fragen, wie z.B. "Wie lese ich Daten aus einer Datei in eine Variable", wird dir jeder gerne beantworten.
Deine Hausaufgaben macht dir hier aber keiner!


mfg
umbrasaxum


----------



## philishake (30. Mai 2005)

das war mir schon klar, hätt ja sein könne, das einer das i-wo zu hause hat rum liegen.
ich habe jetzt schon von vielen varianten gehört dateien einzulesen, aber die funktionieren nie richtig, ich will das mit fopen() und getline() machen, aber egal wie ich die in verbindung bringe der sagt imme das das falsch ist.
Code:

fopen("test.txt");
getline(cin, a);

bzw.

ofstream datei("test.txt");
getline(cin, a);
cout << a ;

aber da  alles net


----------



## Tobias K. (30. Mai 2005)

moin


Da du das ja nur in C++ machen willst, fällt fopen flach, da es C ist!
getline ist auch nciht die beste Wahl. Ich würde alles Zeichenweise in ein Array einlesen und bei jedem '\n' ein Element des Arrays weiter gehen.


mfg
umbrasaxum


----------



## Matthias Reitinger (30. Mai 2005)

Natürlich funktioniert das nicht, du mischt ja sämtliche Möglichkeiten durcheinander und wendest sie teilweise auch noch falsch an... für solche Fälle empfiehlt sich die Anschaffung und Lektüre eines guten Sachbuches zum Thema C++.

Oder du suchst mit Google nach entsprechenden Tutorials (z.B. http://www.cprogramming.com/tutorial/lesson10.html - Zeitaufwand zwei Minuten)

@umbrasaxum: Was spricht gegen die Verwendung von istream::getline?


----------



## Unicate (30. Mai 2005)

so wie ich das sehe, hast du in deinem beispiel weder nen filehandler deklariert weder mit diesem die datei geöffnet.

Ist zwar auch ANSI-C dabei aber du bekommst deine datei auf 

Bsp für öffnung von textdateien:


```
if(!(fp = fopen("text.txt", "w+"))) //lesen und schreiben
{
  cout << "Datei konnte nicht geöffnet werden\n";
}  else  {
  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;
  }
}
```

Filehandler dekarieren:

```
FILE *fp;
```

Nächstes mal bessere Fragestellung!


----------



## philishake (31. Mai 2005)

danke, ich werds ma probiren


----------



## Tobias K. (31. Mai 2005)

moin




			
				Matthias Reitinger hat gesagt.:
			
		

> @umbrasaxum: Was spricht gegen die Verwendung von istream::getline?


Weil er (bei mir) immer nur die erste Zeile liesst  
Rufe ich zweimal nacheinander getline auf wird nur die erste Zeile eingelesen.
Also der "Startpunkt" fürs lesen wird nicht weitergesetzt.


mfg
umbrasaxum


----------



## philishake (31. Mai 2005)

welche HEader Dateiene brauch ich denn für die Variante (@ Unicate) ?


----------



## Unicate (31. Mai 2005)

#include <stdio.h>
evtl string.h weiß ich aber nicht genau versuchs mal ohne


----------



## philishake (31. Mai 2005)

Hi, ich habe nun folgenden Code gewählt und hätte dann noch eine  Frage:



#include <fstream>
#include <iostream>

using namespace std;

void main()
{
	char str[10];


	ifstream b_file ("example.txt");
	b_file >> str;
	cout << str << "\n";
}


Frage:
Wie kann ich ihm sagen, am besten per Variable, das er in die nächste bzw, gewünschte Zeile springt.

mfg phil

PS: Bitte um schnelle ANtowrt, es ist sehr dringend, danke für alle Helfer !


----------



## Tobias K. (31. Mai 2005)

moin


Du könntest die '\n' zählen.

```
while(b_file)
{
    if( b_file.get() == '\n')
        break;
}
```
So müsste er zur nächsten Zeile gehen, hab es aber nciht getestet.

Und dann z.B.:

```
cin>> zeilen;

for(int i=0; i<zeilen; i++)
{
    while(b_file)
    {
        if( b_file.get() == '\n')
            break;
    }
}
```
So würde es thoeretisch gehen.


mfg
umbrasaxum


----------



## philishake (1. Juni 2005)

muss ich jetzte das ifstream in die for schleife einbinden ?


----------



## Tobias K. (1. Juni 2005)

moin


Nein ifstream datei(..... rufst du nur einmal am Anfang auf.


mfg
umbrasaxum


----------



## philishake (1. Juni 2005)

alles aklr, ich probier ma, danke


----------



## philishake (1. Juni 2005)

Also, ich habe das jetzt so:

ifstream b_file ("example.txt");
b_file >> str ;
cout << str << "\n";

cin >> zeilen;
for(int i=0; i << zeilen; i++)
{
     while(b_file)
          {
               if(b_file.get() == "\n")
                  break;
          }
}

aber der gibbt immer nur die erste zahl aus, nicht die ander 3, die darunter stehn...


----------



## Tobias K. (1. Juni 2005)

moin



Der Code den ich gepostet hab soll Zeilen überpringen, drum musst du danach nochmal aus der Datei eine Zahl einlesen.


mfg
umbrasaxum


----------



## philishake (1. Juni 2005)

funktioniert, tausend dank !


----------



## Matthias Reitinger (1. Juni 2005)

umbrasaxum hat gesagt.:
			
		

> Weil er (bei mir) immer nur die erste Zeile liesst
> Rufe ich zweimal nacheinander getline auf wird nur die erste Zeile eingelesen.
> Also der "Startpunkt" fürs lesen wird nicht weitergesetzt.


Das ist aber nicht das beabsichtigte Verhalten. Folgender Quellcode gibt bei mir den Inhalt der Datei aus:

```
#include <fstream>
#include <iostream>

using namespace std;

int main()
{
	ifstream in_file("text.txt");
	char szBuf[1024];
	
	if (!in_file.is_open()) return -1;

	while (!in_file.eof()) {
		in_file.getline(szBuf, 1024);
		cout << szBuf << endl;
	}

	return 0;
}
```


----------

