Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Empfohlene Antworten

Veröffentlicht

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

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()
);
}

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

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

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

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]

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

Vielen Dank, stand kurz auf dem Schlauch.

Manu

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.