Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » Daten umrechnen aus txt file

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
08.05.2009, 18:34 Uhr
~Jogi
Gast


Hallo, ich bin relativ neu mit C++ unterwegs und das ist auch meine erste Programmiersprache. Ich habe ein txt-file mit 6000 Zeilen, die ich von feet in Meter umrechnen will. In jeder Zeile steht erst eine Zahl, dann ein Space, dann die Einheit (ft). Allerdings steht nicht in jeder Zeile ein Wert, in manchen Zeilen steht ein "N" für "No Data".
Ich hab mir das bisher so gemacht, dass ich mir zuerst mit tellg die Position merke, dann mit getline die komplette Zeile eingelesen habe und dann vergleiche ob in der Zeile ein N steht oder nicht. Steht ein N soll er "nodata" schreiben, sonst zurück zur letzten gespeicherten Position und einen float (die Zahl) und ein string (die Einheit) einlesen. Der float soll dann in Meter umgerechnet werden und in die neue Datei geschrieben werden. Das ganze funktioniert bisher so lange kein "N" steht. Beim ersten "N" bleibt das Skript hängen und schreibt unendlich oft die letzte Zahl vor dem "N" in die Datei.
Das ganze sieht bisher so aus:


C++:
#include <fstream>
#include <iostream>
#include <iomanip>
using namespace std;

int main() {
    float tiefe;
    string ft;
    char zeile[100];
    string zeichen="N";
    int zaehler=0;
    string zeilestr;
    
    streampos einlesepos;
    ifstream eingabe("/EL_tiefe.txt", ios::in);
    if (eingabe.good()){
        cout<<"Datei konnte geöffnet werden"<<endl;
    }
    else
        cout<<"Fehler beim öffnen"<<endl;
    ofstream ausgabe("EL_tiefe_m.txt", ios::out);
    eingabe.seekg(0L,ios::beg);

    while (!eingabe.eof()) {
        einlesepos=eingabe.tellg();
                eingabe.getline(zeile,100);
        zeilestr=zeile;
        if(zeilestr==zeichen){
            ausgabe<<"nodata"<<endl;
        }
        else{
            eingabe.seekg(einlesepos,ios::beg);
            eingabe>>tiefe>>ft;
            ausgabe<<(tiefe*0.3048)<<" m"<<endl;
        }
    }
    return 0;
    }



Ich weiß, dass ich das ganze auch mit Excel machen könnte, aber ich würde es gerne so hinbekommen, da ich nicht nur eine Datei hab...Wäre für Hilfe echt dankbar.
Vielen Dank
Jogi

mod edit: :twisted: verwende die CPP-Tags selber :twisted:

Dieser Post wurde am 13.05.2009 um 21:55 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.05.2009, 19:03 Uhr
Kest
saint



C++:
#include <fstream>
#include <sstream>
#include <string>


int main() {
    const double foot = 0.3048;
    
    std::ifstream in("L_tiefe.txt");
    std::ofstream out("out.txt");
    
    std::string line;
    std::stringstream ss;
    double x = 0.0;
    
    while(std::getline(in, line)){
          if(line[0] == 'N'){
             out << "no data" << std::endl;
          } else {
             ss.clear();
             ss.str(line);
             ss >> x;
             out << line << " = " << x*foot << " m" << std::endl;
          }
    }
    return !in.eof() || !out;
}

--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.

Dieser Post wurde am 08.05.2009 um 19:07 Uhr von Kest editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
10.05.2009, 20:26 Uhr
Bruder Leif
dances with systems
(Operator)


Das wuerde ich eher mit awk angehen:


Code:
awk '$1 != "N" { print $1 * 0.3048, $2 } $1 == "N" { print "nodata" }' L_tiefe.txt


--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: