002
04.07.2004, 16:42 Uhr
0xdeadbeef
Gott (Operator)
|
Was nimmst du so ein kompliziertes Dateiformat? Da musste ja nachher wieder fummelparsen oder mit nem parser generator ran. Dieses Programm hier liest die Zahlen aus einer entsprechend geformten Datei in einen std::vector<int> ein und benutzt dafür boost::spirit.
C++: |
#include <algorithm> #include <fstream> #include <iostream> #include <iterator> #include <string> #include <vector>
#include "boost/spirit/core.hpp"
using namespace boost::spirit;
int main(int argc, char *argv[]) { std::string fcnt; std::ifstream fin; std::vector<int> v; char c;
if(argc < 2) { std::cout << "Dateiname angeben!" << std::endl; return 3; }
fin.open(argv[1]); if(fin) { while((c = fin.get()) != EOF) fcnt += c;
if(parse(fcnt.c_str(), *(str_p("-----") >> "Zahl" >> int_p >> ':' >> int_p[push_back_a(v)]) >> "-----", space_p).full) { // Hier kann man dann mit dem vector arbeiten. In diesem Fall gebe // ich die Zahlen einfach wieder aus. std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl; } else { std::cout << "Datei passt nicht auf das vorgegebene Format." << std::endl; return 2; } } else { std::cout << "Konnte Datei nicht öffnen." << std::endl; return 1; } return 0; }
|
Wenn du das Dateiformat vereinfachst, kommst du auch einfacher dabei weg - in diesem Fall würde ich die Zahlen einfach hintereinander weg schreiben, dann kannst dus so machen:
C++: |
std::ifstream fin("dateiname"); for(std::istream_iterator<int> i(fin); i != std::istream_iterator<int>(); ++i) { int zahl = *i; //...weiter machen... }
|
oder auch, für den Anfang wahrscheinlich einfacher:
C++: |
while(fin) { int zahl; fin >> zahl;
//...weiter machen... }
|
-- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 04.07.2004 um 16:48 Uhr von 0xdeadbeef editiert. |