einlesen von Daten mit Hilfe von Strings


SteffBoi

Grünschnabel
Hallo,

ich Viele von Euch könne solche Fragen bald sicher nicht mehr hören bzw. lesen. Aber ich komme mit den SAchen die ich hier bisher dazu gefunden habe einfach nicht klar. Also zu meinem Problem:

Ich will Dateien einlesen auf deren Zeilen Datensätze mit beliebig vielen Parametern stehen (also Zeilen die Datensätze, Spalten die jeweiligen Parameter).

Soweit bin ich :

Code:
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>

int main()
{
	
	char dateiname[80];
	std::cout << "Bitte Quelldateiname eingeben:";
	std::cin.getline(dateiname, 80);

	std::ifstream quelldatei; 	// anlegen eines File-Stream für die Quelldatei
	quelldatei.open(dateiname,std::ios::in); 	// öffnen der Quelldatei für die Koeffizienten
	
	if (!quelldatei)		// datei.fail()
		{
		std::cerr << "Datei konnte nicht geöffnet werden\n" << std::endl;
		return 1;
		}
	
	int zeilenNr = 0;
	char zeile[256];// Zeile mit maximal 256 Zeichen
	double laenge[256];
	double breite[256];
	
	while( quelldatei.getline(zeile, sizeof(zeile)) )	 // Zeilenweise lesen der Quelldatei solange letzte Zeile nicht erreicht ist
		{
			
			std::string laeng;
			std::string breit;
                           std::istringstream hilfsZeile (zeile);						
	 		hilfsZeile >> laeng >> breit;
	 		 			
			breite[zeilenNr] = std::atof(breit);
	                  laenge[zeilenNr] = std::atof(laeng);	

			std::cout << "eingelesene laenge" << laenge[zeilenNr] << std::endl;
			std::cout << "eingelesene breite" << breite[zeilenNr] << std::endl;
			++zeilenNr;
			
		}
	
	if (!quelldatei.eof())
		{
		std::cerr << "\nLesefehler!\n" << std::endl;
		return 2;
		}
	
		
	quelldatei.close(); 								
	std::cout << "Quelldatei geschlossen";
	   
	return 0;	
}

Und ich kriege dann folgende Fehlermeldung:

Code:
main.cpp: In function `int main()':
main.cpp:40: cannot convert `std::string' to `const char*' for argument `1' to 
   `double atof(const char*)'
main.cpp:41: cannot convert `std::string' to `const char*' for argument `1' to 
   `double atof(const char*)'
mingw32-make: *** [main.o] Error 1

Ich habe nun das Gefühl das ich mich hier total verzettelt habe und vielleicht hat ja von Euch einer Lust mir zu helfen hier Ordnung reinzubringen. Danke schon mal.

Steffen
 

CodeFatal

Erfahrenes Mitglied
Moin,
Mit den Strings komm ich jetzt auf die schnelle auch irgendwie nicht klar, aber falls das nur laufen soll und du keine Ansprüche hast gehts einfach wenn du MFC Unterstützung aktivierst. Die Klasse CString macht das auf jeden Fall richtig.

Gruss Michael
 

Nospherates

Erfahrenes Mitglied
Hi,
ersetz das string einfach durch char *.
Code:
char* laeng;
char* breit;

Ich krieg dann zwar in der Zeile
Code:
 std::istringstream hilfsZeile (zeile);
einen Fehler, aber das wäre ja dann evtl ein anderes Problem ;). Kompilieren läuft auf jeden Fall.

Warum benutzt du Anfangs nicht
Code:
using namespace std;
würdest du dir das ständige std:: sparen, oder findest du es so übersichtlicher?

Würde übrigens auch eher zu CString raten, es sei denn du willst ohne MFC programmieren.

Gruß
 

Turri

Erfahrenes Mitglied
Hallo,

vielleicht hilft das weiter.

Code:
string s = "bla";
const char* c = s.c_str();

MfG Turri
 

FireFlow

Erfahrenes Mitglied
Nospherates hat gesagt.:
Hi,
ersetz das string einfach durch char *.
Code:
char* laeng;
char* breit;

Da hast du aber tolle Pointer, nun bräuchte man nur noch Speicher dafür, aber das lassen wird schön bleiben wenn wir C++ programmieren.

Zur Frage:

Für die I/O-Streams sind die Operatoren >> und << auch für int/float/etc überladen. D.h. du musst gar nicht in die Strings breit/lang zwischenspeichern. Schreib direkt in das Array breite und laenge. Die alten C-Funktionen atof usw. sind auch nicht mehr aktuell. Da würde ich viel lieber boost::lexical_cast<> verwenden, der schmeißt dann auch eine Exception wenn das mal nicht klappt.

Gruß
 

Nospherates

Erfahrenes Mitglied
FireFlow hat gesagt.:
Da hast du aber tolle Pointer, nun bräuchte man nur noch Speicher dafür, aber das lassen wird schön bleiben wenn wir C++ programmieren.

Danke für den Tipp her Lehrer... verweis nur mal kurz auf den Forennamen "C\C++" :D.

Gruß
 

SteffBoi

Grünschnabel
FireFlow hat gesagt.:
Da hast du aber tolle Pointer, nun bräuchte man nur noch Speicher dafür, aber das lassen wird schön bleiben wenn wir C++ programmieren.

Zur Frage:

Für die I/O-Streams sind die Operatoren >> und << auch für int/float/etc überladen. D.h. du musst gar nicht in die Strings breit/lang zwischenspeichern. Schreib direkt in das Array breite und laenge. Die alten C-Funktionen atof usw. sind auch nicht mehr aktuell. Da würde ich viel lieber boost::lexical_cast<> verwenden, der schmeißt dann auch eine Exception wenn das mal nicht klappt.

Gruß

Danke noch mal, funktioniert super
Steffen
 

SteffBoi

Grünschnabel
Hallo noch mal,

das klappt jetzt alles super aber meine Probleme nehmen kein Ende. Jetzt hab ich also eine Klasse Datensatz die durch einen Konstruktor durch einlesen aus einer Datei erzeugt wird, das klappt auch! Jetzt wollte ich der Klasse Methoden mitgeben bekomme aber immer folgende Fehlermeldung :

Code:
main.cpp: In function `int main()':
main.cpp:13: statement cannot resolve address of overloaded function
mingw32-make: *** [main.o] Error 1

ich weiß das durch meine Methode eine externe Funktion überladen wird (oder so ähnlich)´und ich weiß auch das ich nun friend-Klassen einbinden sollte. Meine Frage ist nun woher weiß ich welche Klasse ich einbinden muss :confused: ?

Danke schon mal im Voraus
 

SteffBoi

Grünschnabel
deepthroat hat gesagt.:
Hi.

Also ohne da mal etwas Code zur Illustration zu sehen kann ich mir nicht vorstellen was du überhaupt meinst.

Gruß

OK, so soll es dann sein:

main.cpp
Code:
#include "Datensatz.h"
#include <iostream>

int main()
{
	datensatz test;
	test.outDat;
}

Datensatz.h
Code:
#ifndef DATENSATZ_H_
#define DATENSATZ_H_

#include <iostream>
#include <string>

class datensatz
{
	private:
		double Cnm[256];									
		double Snm[256];
	public:
		datensatz();
		~datensatz();
		
		void writeDat();
		void outDat();
};
#endif /*DATENSATZ_H_*/

Datensatz.cpp
Code:
#include "Datensatz.h"

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



int anzahlObjekt = 0;

// Konstruktor

datensatz::datensatz()
	{
		char dateiname[80];
		std::cout << "Bitte Quelldateiname eingeben:";
		std::cin.getline(dateiname, 80);
		std::ifstream quelldatei;
                                quelldatei.open(dateiname,std::ios::in); 			

		if (!quelldatei)
			{
			std::cerr << "Datei konnte nicht geöffnet werden\n" << std::endl;
			return;
			}
	
		int zeilenNr = 0;
		char zeile[256]; 									
		while( quelldatei.getline(zeile, sizeof(zeile)) )	
                   {
				std::istringstream hilfsZeile (zeile);	
		 		hilfsZeile >> Cnm[zeilenNr] >> Snm[zeilenNr];
	 		 	
				std::cout << "eingelesene laenge" << Cnm[zeilenNr] ;
				std::cout << "eingelesene breite" << Snm[zeilenNr] << std::endl;
				++zeilenNr;
			}
	
		if (!quelldatei.eof())
		
			{
			std::cerr << "\nLesefehler!\n" << std::endl;
			return;
			}
			
		quelldatei.close();
		std::cout << "Quelldatei geschlossen";
	}
	
// Destruktor

datensatz::~datensatz()

	{
		std::cout << "Datensatz wurde gelöscht";
	}

void datensatz::outDat()

	{
		std::cout << "hier soll später die Ausgabe hin Datenausgabe" << std::endl;
	}

So und hier noch mal die Fehlermeldung
Code:
mingw32-make -f makefile all 
g++ -c -g main.cpp
main.cpp: In function `int main()':
main.cpp:10: statement cannot resolve address of overloaded function
mingw32-make: *** [main.o] Error 1
 
Zuletzt bearbeitet:

rohrbold

Mitglied
SteffBoi hat gesagt.:
OK, so soll es dann sein:

main.cpp
Code:
#include "Datensatz.h"
#include <iostream>

int main()
{
	datensatz test;
	test.outDat;
}

Rufe die Funktion mittels test.outDat(); auf (Beachte die öffnende und schließende Klammer).
That should do the trick.

Martin
 

Neue Beiträge