2009-07-30 11 views
0

Ich bin neu in C++ Programmierung. Ich versuche, Daten in einer Datei, deren Inhalt zu lesen sind wie folgt:Eine Datei mit Daten lesen

AS G02 2009 01 30 00 00 0.000000 2 1.593749310156e-04 4.717165038980e-11 
AS G03 2009 01 30 00 00 0.000000 2 3.458468649886e-04 4.542246790350e-11 
AS G04 2009 01 30 00 00 0.000000 2 -3.176765824224e-04 2.733827659950e-11 
AS G05 2009 01 30 00 00 0.000000 2 -6.126657874204e-04 3.269050090460e-11 

Ich würde dann später diese Daten in eine Ausgabedatei für die Verarbeitung schreiben. Der Ausgang sollte so aussehen:

02 2009 01 30 00 00 0.000000 2 1.593749310156e-04 4.717165038980e-11 
03 2009 01 30 00 00 0.000000 2 3.458468649886e-04 4.542246790350e-11 
04 2009 01 30 00 00 0.000000 2 -3.176765824224e-04 2.733827659950e-11 
05 2009 01 30 00 00 0.000000 2 -6.126657874204e-04 3.269050090460e-11 

Kann jemand helfen. Grüße

+0

Was ist das Ausgabeformat spec? Whitespace, Leerzeichen, Tabs? – Tim

+0

Das klingt nach einer Hausaufgabe. – JohnFx

Antwort

1

Lesen Sie die Datei Zeile für Zeile und ersetzen "AS G" durch eine leere Zeichenfolge. Häufig wird es mehr Spaß machen, wenn Sie versuchen, es selbst zu tun (nicht zu erwähnen, dass Sie auf diese Weise viel mehr lernen werden).

Zum Beispiel Code und die Grundlagen, die Sie dafür benötigen, schauen Sie at this discussion und die documentation of string replace.

+0

Ich glaube nicht, dass das OP weiß, wie man die grundlegende Eingabe/Ausgabe tut. –

1

Benötigen Sie C++? Wenn nicht, dann wäre Perl oder ein anderes ähnliches Werkzeug/Sprache viel einfacher (und ich bin ein C++ - Entwickler)

+0

Ja. Perl ist gut für diese Lösung +1, aber C++ kann mehr Spaß machen :-) –

3

Angenommen, Sie müssen dies in C++ tun (awk wäre einfacher), dann müssen Sie darüber lernen Iostreams.

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

int main() 
{ 
    std::ifstream input("file.txt"); 
    std::stringstream sstr; 
    std::string line; 

    while(getline(input,line)) { 
    if (line.length() > 4) { 
     std::cout << line.substr(4); // Print from the 4th character to the end. 
    } 
    } 
} 

Standardmäßig liest getline die Eingabe bis zum Ende der Zeile. Sie können die Eingabe auch lesen lassen, bis sie ein spezifisches Zeichen erhält, zB Leerzeichen oder Komma mit getline (stream, string, delimiter). Auf diese Weise können Sie eine Zeile nacheinander lesen und die einzelnen Werte verarbeiten.

ps. Wann wird SO intellisense?

+0

Wird "Eingabe >> sstr" Ihnen nicht ein Feld, sondern eine Zeile geben? –

+0

oops, sorry wurde ein Beispiel mit getline –

+0

ändern viel besser, und jetzt eine sehr gute Antwort. –

1

Ich bevorzuge die Antwort von 'mgb' oben.
Aber nur zum Spaß:

#include <fstream> 
#include <iostream> 
#include <iterator> 
#include <algorithm> 

struct Line 
{ 
    std::string line; 
}; 
std::ostream& operator<<(std::ostream& str,Line const& data) {return str << data.line << "\n";} 
std::istream& operator>>(std::istream& str,Line&  data) {return std::getline(str,data.line);} 

template<std::string::size_type Start> 
struct ShortLine: public Line 
{ 
    ShortLine(Line const& value) 
    { 
     // Note you need to check Start is in the correct rangs. 
     line = value.line.substr(std::min(Start,value.line.size())); 
    } 
}; 

int main() 
{ 
    std::fstream file("Plop"); 

    std::copy( std::istream_iterator<Line>(file), 
       std::istream_iterator<Line>(), 
       std::ostream_iterator<ShortLine<4> >(std::cout) 
      ); 

}