# Textdatei auslesen und in String speichern



## blong1550 (14. Januar 2010)

Hallo,

ich habe folgende Aufgabe bekommen.

string readFile (string filename): Diese Funktion liest die Datei vom Namen
filename ein, speichert den Inhalt als String ab und gibt diesen zur¨uck.

vorgegeben haben wir eine text.txt.

Meine Funktion sind bisher so aus:


```
string readFile (string filename)
{
	string inhalt;
	ifstream quelle;
	quelle.open(filename.c_str());
		if (!quelle)
		{
			cerr << filename << " kann nicht geöffnet werden!\n";
			exit(-1);
		}


		char ch;
		while (quelle.get(ch))
		{
			cout << ch;

		}
```

Das Problem ist, es funktioniert bei der langen Textdatei nicht mehr und außerdem speichert er es ja nicht in einem String.
Nun tue ich mich etwas schwer und weiß nicht wie ich die komplette textdatei als string speichere?


Grüße


----------



## ComFreek (14. Januar 2010)

Vllt. führen zu große Textdateien zu einem Pufferüberlauf?

Du kannst auch gleich den ganzen Inhalt lesen mit dem Operater _>>_:


```
ifstream f('text.txt');
string S;
f >> S;
```

Habe jetzt ohne Fehler-Überprüfung gemacht. Müsste aber klappen!


----------



## blong1550 (14. Januar 2010)

mh ne das *funktionier*t nicht

  initializing argument 1 of `std::basic_ifstream<_CharT, _Traits>::basic_ifstream(const char*, std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_traits<char>]'	
invalid conversion from `int' to `const char*'	


Keine Ahnung was da lost ist.


----------



## blong1550 (14. Januar 2010)

habs jetzt selbst geschafft. ich weiß nicht ob es nicht noch kürzer geht aber so geht es wenigstens -.-


```
string readFile (string filename)
{
	string zeile,inhalt ;
	ifstream quelle;
	quelle.open(filename.c_str());
	if (!quelle)
	{
		cerr << filename << " kann nicht geöffnet werden!\n";
		exit(-1);
	}

	while (!quelle.eof())
	{
		getline(quelle,zeile);
		inhalt = inhalt + zeile;
	}

	return inhalt;

}
```


----------



## deepthroat (14. Januar 2010)

Hi.


ComFreek hat gesagt.:


> Vllt. führen zu große Textdateien zu einem Pufferüberlauf?
> 
> Du kannst auch gleich den ganzen Inhalt lesen mit dem Operater _>>_:


Der >> Operator liest aber nur ein Wort ein (also bis zum nächsten Leerzeichen).


blong1550 hat gesagt.:


> mh ne das *funktionier*t nicht
> 
> initializing argument 1 of `std::basic_ifstream<_CharT, _Traits>::basic_ifstream(const char*, std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_traits<char>]'
> invalid conversion from `int' to `const char*'
> ...


ComFreek hat fälschlicherweise statt doppelten Anführungszeichen einfache Anführungszeichen verwendet.

Um eine Datei komplett einzulesen:

```
string readFile (const string& filename)
{
  ifstream quelle(filename.c_str());
 
  if (quelle.is_open()) {
    stringbuf buffer;
    
    if (quelle >> &buffer) {
      return buffer.str();
    } else {
      // I/O Fehler
    }
  } else {
    // Datei existiert nicht oder kein Zugriff möglich
  }
}
```
Gruß


----------

