Zum Inhalt springen

Daten aus txt-Datei auslesen und Punkt in Komma ändern.


Empfohlene Beiträge

Geschrieben

Guten Morgen.

Ich habe letzte Woche ein Praktikum begonnen und eine Programmieraufgabe aufs Auge gedrückt bekommen. Jetzt suche ich seit drei Stunden im Internet nach einer Lösung für folgendes Problem:

Ich muss eine txt-Datei mit Zahlenwerten auslesen und Kommazahlen in Punktzahlen verwandeln um damit dann in C++ weiterarbeiten zu können. Das ist kein Problem und ich habe auch schon viele Codes dafür gesehen. Unter anderem auch diesen hier:

int main(void)

 {	 


  ifstream in("LissajouDaten1.txt");

  copy(istreambuf_iterator<char>(in),

       istreambuf_iterator<char>(),

       ostreambuf_iterator<char>(cout)

       );

       cin.get();

  return EXIT_SUCCESS;


}

Der ließt mir zwar meine Datei aus, ich kann ihn jedoch nicht dazu bewegen mir meine ausgelesenen Kommazahlen in Punktzahlen zu verwandeln. Ich weiß auch nicht so recht, ob das überhaupt ein geeigneter Code für die Manipulation meiner Daten ist.

Wäre sehr erfreut über Hilfe.

Gruß Manu

Geschrieben
Der ließt mir zwar meine Datei aus, ich kann ihn jedoch nicht dazu bewegen mir meine ausgelesenen Kommazahlen in Punktzahlen zu verwandeln.
Du benutzt std::copy. Diese Funktion kopiert Daten, und beim Kopieren möchte man die Daten üblicherweise nicht verändern.

Du könntest std::transform benutzen:

int main()
{
ifstream in("LissajouDaten1.txt");
transform(
istream_iterator<char>(in),
istream_iterator<char>(),
ostream_iterator<char>(cout),
[](char c)->char {
if(c==',')
return '.';
return c;
}
);
}[/code] Wenn du keinen Compiler hast, der Lambda-Ausdrücke beherrscht, kannst du einen Funktor oder Funktionszeiger für die Transformierung benutzen:
[code]struct ReplaceCommaWithPeriod
{
char operator() (char c)
{
if(c==',')
return '.';
return c;
}
};

int main()
{
ifstream in("LissajouDaten1.txt");
transform(
istream_iterator<char>(in),
istream_iterator<char>(),
ostream_iterator<char>(cout),
ReplaceCommaWithPeriod()
);
}

Geschrieben

Hallo mathemanu,

ich habe nachfolgendes mal probiert:

------------------------------------

#include "apdefap.h"

void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)

{

char data_4[80] = "Ich habe hier ein , anstatt eines Punktes";

char *pTmp;

pTmp = strchr(data_4, (int)',');

if (pTmp != NULL){

*pTmp = '.';

}

printf(data_4);

}

---------------------------------------------

Das Komma wird im array of char durch einen Punkt ersetzt

und mit printf ausgegeben.

Du musst noch dafür sorgen, dass die Zeile aus der Datei in data_4

transferiert wird.

Gruß

Eleu

Geschrieben

Danke für die schnelle Hilfe. Jetzt habe ich aber noch eine Frage. Es handelt sich um die Weiterverarbeitung meiner Daten. Ich brauche Zugriff auf jede einzelne Zahl. Dafür ist der Code doch nicht geeignet, oder? Sollte ich dafür die Datei nicht zeilenweise auslesen und vllt in ein Array schreiben?

Ich bin ein wenig verwirrt durch die ganze Flut an Möglichkeiten aus dem Netz.

Manu

Geschrieben

Ich habe jetzt folgendes programmiert:


int main(){


	float newrows[10000];

	string s;


    string row;

    vector<string> rows;

    ifstream file("LissajouDaten1.txt");


    while(getline(file,row)) rows.push_back(row);


    cout << "File content: " << endl;


    for(int i = 0; i < rows.size(); i++) 

    {

	    cout << rows[i] << endl;

    }


        for(int i = 0; i < rows.size(); i++) 

        {

			s=rows[i];

	        s=atof(s.Replace(",","."));

	  		newrows[i]=s;

        }

//         cout<< rows[2]<<endl;

//         cin.get();


}

In der letzten Schleife will ich das Komma durch den Punkt ersetzen und gleichzeitig von string zu float konvertieren.

Leider bekomme ich aber zwei Fehlermeldungen raus:

1. Replace ist not a member of string

2. Cannot convert string to float

Die zweite Meldung ist mir klar, da ich ja keine Ersetzung des Kommas erreicht habe, kann er auch nicht konvertieren. Nun aber meine Frage, wie kann ich denn das Komma ersetzen, wenn ich nicht Replace benutzen kann?

Manu

Geschrieben
Die zweite Meldung ist mir klar, da ich ja keine Ersetzung des Kommas erreicht habe, kann er auch nicht konvertieren.
Nein, das ist nicht der Grund. Du versuchst, dem float newrows den String s zuzuweisen, das ist von deiner fehlgeschlagenen Ersetzung völlig unabhängig.

Es gibt übrigens in der gesamten C++-Standardbibliothek keine Funktion oder Methode, in deren Namen Großbuchstaben vorkommen. Keine Ahnung, woher du Replace hast.

Ich würde erst mal alles in einen Stringstream packen und dabei die Kommas durch Punkte ersetzen, und dann daraus einen float-vector befüllen:

ifstream in("LissajouDaten1.txt");
in.unsetf(ios_base::skipws);

stringstream ss;

transform(
istream_iterator<char>(in),
istream_iterator<char>(),
ostream_iterator<char>(ss),
[](char c)->char {
if(c==',')
return '.';
return c;
}
);

vector<float> newrows;
copy(
istream_iterator<float>(ss),
istream_iterator<float>(),
back_inserter(newrows));[/code]

Geschrieben

Habe deinen Vorschlag versucht zu kompilieren, aber bekomme die Fehlermeldung "Expression syntax in line 29".

Also bei

	[](char c)->char {

scheint was faul zu sein.

Danke für die Antwort.

Manu

Geschrieben

Also bei

	[](char c)->char {

scheint was faul zu sein.

Wie ich bereits sagte:

Wenn du keinen Compiler hast, der Lambda-Ausdrücke beherrscht, kannst du einen Funktor oder Funktionszeiger für die Transformierung benutzen:

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...