C++ In Datei schreiben & Aus Datei lesen - Finde den Fehler net

Dasun

Lieutenant
Registriert
Aug. 2012
Beiträge
846
Guten Abend,

ich habe ein Problem mit folgendem Code:

Code:
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <list>
#include <string>


template <class T> void printme(const T& t) 
{
	std::cout << t << " ";
}

template <class T> void write(const T& t, std::string dataname)
{
	fstream f;
	f.open(dataname, ios::out);
	for (int i = 0; i <= t.size()-1; i++){
		outfile << T.at(i) << endl;
	}
	f.close;
}

template <class T> void read(const T& t, std::string dataname)
{
	fstream f;
	f.open(dataname, ios::in);
	for (int i = 0; i <= t.size()-1; i++){
		infile >> T.at(i); 
	}
	f.close;
}

int main()
{

        // Vektoren erstellen
	std::vector<std::string> strings;
	strings.push_back("Hello");
	strings.push_back("STL");
	strings.push_back("World");

	std::list<float> numbers;
	numbers.push_back(1.618f);
	numbers.push_back(2.718f);
	numbers.push_back(3.141f);

	// Dateiname angeben
	std::string filename_strings = "file_strings.dat";
	std::string filename_numbers =  "file_numbers.dat";
		
	// Aufrufe write
	write(strings, filename_strings);
	write(numbers, filename_numbers);

	std::list<std::string> strings2;
	std::vector<float> numbers2;

	// Aufrufe load
	read(strings2, filename_strings);
	read(numbers2, filename_numbers);

	for_each(strings2.begin(), strings2.end(), printme<std::string>);
	std::cout << '\n';

	for_each(numbers2.begin(), numbers2.end(), printme<float>);
	std::cout << std::endl;

	return 0;
}

Die Idee dahinter ist es, Werte in einem Vector zu speichern, diese in eine Datei zu schreiben, daraus heraus zu lesen und dann die Werte ausgeben zu lassen. Da dies mit mehreren verschiedenen Datentypen gehen soll, habe ich es über ein template und der STL realisiert.

Der Debugger gibt mir jetzt folgende Fehlermeldung:

./stl.cpp:34:10: error: expected ';' before 'f'
./stl.cpp:35:2: error: 'f' was not declared in this scope
./stl.cpp:35:19: error: 'ios' has not been declared
./stl.cpp:37:3: error: 'infile' was not declared in this scope
./stl.cpp:37:14: error: expected primary-expression before '.' token

Anscheinend erkennt er nicht, dass ich meine fstream f genannt habe und damit innerhalb read und write arbeiten will., was mir auch die anderen Fehlermeldungen zeigen (f not in scope).

Ich freue mich über jeden Hinweis, wo das Problem liegt.

Danke im voraus,

Sebastian
 
Du verwendest für fstream keine Namensraumspezifizierung. Wie bei vector<> fehlt dort das std:: vor fstream.
 
close ist eine methode, also close(). Außerdem frage ich mich, wo du die bezeichner "infile" und "outfile" herholst. Du hast ja selber geschrieben, dass du deinen fstream "f" genannt hast. Ferner heisst es ios_base::in bzw. out.

Und wie Kai schon meinte, den Namensraum std spezifizieren.. entweder mit std:: oder einmal am anfang using namespace std;
 
Danke für die Antworten. Ich hab den Code ursprünglich von http://www.willemer.de/informatik/cpp/fileop.htm übernommen gehabt:

Code:
#include <fstream>
using namespace std;

int main()
{
    fstream f;
    f.open("test.dat", ios::out);
    f << "Dieser Text geht in die Datei" << endl;
    f.close();
}

Derzeit sieht es so aus:

Code:
template <class T> void write(const T& t, std::string dataname)
{
	std::fstream f;
    f.open("test.dat", ios::out);
	for (int i = 0; i <= t.size()-1; i++){
		f << T.at(i) << std::endl;
	}
    f.close();
}

template <class T> void read(const T& t, std::string dataname)
{
	std::fstream f;
    f.open("test.dat", ios::in);
	for (int i = 0; i <= t.size()-1; i++){
		f >> T.at(i); 
	}
    f.close();
}

was aber immer noch nicht funktioniert.
 
Was kommen denn im Moment für Fehler? Und schau mal, dass du ios_base::in bzw. ios_base::out nimmst statt ios::in und ios::out beim file oeffnen.

Uns hat man übrigens immer von diesen ominösen Willemer-Büchern abgeraten. Soll wohl ziemliches Geschwätz sein. Aber das nur unabhängig von deinem Problem.
 
Oh sry, mein Fehler

./stl.cpp: In function 'void write(const T&, std::string)':
./stl.cpp:25:22: error: 'ios' has not been declared
./stl.cpp:27:9: error: expected primary-expression before '.' token
./stl.cpp: In function 'void read(const T&, std::string)':
./stl.cpp:35:22: error: 'ios' has not been declared
./stl.cpp:37:9: error: expected primary-expression before '.' token
 
Code:
template <class T> void read(const T& t, std::string dataname)
{
	fstream f;
	f.open(dataname, ios::in);
	for (int i = 0; i <= t.size()-1; i++){
		infile >> T.at(i); 
	}
	f.close;
}

Ich verstehe nicht, wie dein Code funktionieren kann. Du schleifst über eine Liste, die in dem Moment überhaupt kein Element hat, sondern leer ist. Siehe Codezeilen vor dem Funktionsaufruf:
Code:
	std::list<std::string> strings2;
	std::vector<float> numbers2;
Und dann willst anhand der Größe deiner Liste es mit Elementen füllen!?
 
Da stimme ich @Prog zu. Falls das der echte Code ist würde read (und auch write) noch nichtmal compilieren, geschweigedenn funktionieren:
  • t ist eine Konstante referenz, also lässt sich der container nicht mit dem Inhalt der Datai füllen.
  • infile gibt es nicht (soll wohl f heißen)
  • T.at(i) ist wohl ebenfalls ein typo und soll t.at(i) heißen.
  • std::list hat überhaupt keine .at methode. Hier muss man mit iteratoren bzw. range-based-for-loop arbeiten.

Davon abgesehen kann man sich bei write und read etwas Tipparbeit sparen:

Code:
template <class T> void write(const T& t, std::string dataname)
{
    std::fstream f("test,dat",std::ios::out);   //std::ios::out könnte man auch weglassen
    for (int i = 0; i < t.size(); ++i){
	f << t.at(i) << "\n";
    }        
}
 
Leute, der Beitrag ist schon über 3 Jahre alt. Das hat sich längst erledigt.
 
Zurück
Oben