Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Datei einlesen unter C++

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, 11:49 Uhr
xyz



Hallo,
wie würde eine passende Datenstruktur unter C++ aussehen und wie liest man unter die folgende Datei ein:

Code:
44      23.764  55.050  18.338
45      17.697  75.884  26.178
48      22.351  66.269  28.727
49      19.980  63.046  33.535



Viele Grüße
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.05.2009, 18:28 Uhr
0xdeadbeef
Gott
(Operator)


Eine sinnvolle Benennung hängt davon ab, was die Daten genau repräsentieren. Implementieren würde ich das ganze wohl etwa so:

C++:
#include <fstream>
#include <iostream>
#include <vector>

struct datensatz {
  int n;
  double x, y, z;
};

std::istream &operator>>(std::istream &in, datensatz &d) {
  return in >> d.n >> d.x >> d.y >> d.z;
}

int main() {
  std::vector<datensatz> daten;
  datensatz d;
  std::ifstream in("datei.txt");

  while(in >> d) {
    daten.push_back(d);
  }
}


...jedenfalls dann, wenn ich mich darauf verlassen kann, dass die Datei keinen Unfug enthält. Ansonsten muss da eine sinnvollere Fehlerbehandlung hin, und ich würde im Zweifel einen LL-Parser benutzen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 08.05.2009 um 18:29 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.05.2009, 03:51 Uhr
~xyz
Gast


Danke es funktioniert.

Wie kann man den Vector Datensatz ausgeben?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.05.2009, 18:04 Uhr
0xdeadbeef
Gott
(Operator)


Beispielsweise:

C++:
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <vector>

struct datensatz {
  int n;
  double x, y, z;
};

std::istream &operator>>(std::istream &in, datensatz &d) {
  return in >> d.n >> d.x >> d.y >> d.z;
}

std::ostream &operator<<(std::ostream &out, datensatz const &d) {
  return out << d.n << '\t' << d.x << ' ' << d.y << ' ' << d.z;
}

int main() {
  std::vector<datensatz> daten;
  datensatz d;
  std::ifstream in("datei.txt");

  while(in >> d) {
    daten.push_back(d);
  }

  std::copy(daten.begin(),
            daten.end(),
            std::ostream_iterator<datensatz>(std::cout, "\n"));
}


...wobei statt der copy-Anweisung auch

C++:
for(int i = 0; i < daten.size(); ++i) {
  std::cout << daten[i] << std::endl;
}


funktioniert. Sieht nur nicht so schick aus.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 09.05.2009 um 18:05 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.05.2009, 11:22 Uhr
~f.-th.
Gast


Wenn noch ein wenig Optik gefragt ist:


C++:
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <vector>
#include <iomanip>

struct datensatz {
  int n;
  double x, y, z;
};

std::istream &operator>>(std::istream &in, datensatz &d) {
  return in >> d.n >> d.x >> d.y >> d.z;
}

std::ostream &operator<<(std::ostream &out, datensatz const &d) {
  return out << d.n << '\t' << d.x << "  " << d.y << "  " << d.z;
}

int main() {
  std::vector<datensatz> daten;
  datensatz d;
  std::ifstream in("datei.txt");

  while(in >> d) {
    daten.push_back(d);
  }


  std::cout.setf(std::ios::fixed);
  std::cout.precision(3);
  std::copy(daten.begin(),
            daten.end(),
            std::ostream_iterator<datensatz>(std::cout, "\n"));
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
14.05.2009, 05:23 Uhr
~xyz
Gast


Danke, für die Beispiele.

Wenn ich diese for-Scheife

Code:
for (int i = 0; i < daten.size(); i++)

verwende bekomme ich vom Compiler dieses Warning:

Code:
warning: comparison between signed and unsigned integer expressions



Was mache ich falsch?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
14.05.2009, 05:46 Uhr
0xdeadbeef
Gott
(Operator)


Das macht in dem Zusammenhang keinen großen Unterschied, weil i nicht in die negativen geht, aber prinzipiell ist's schon richtig, Compilerwarnungen sollte man ernst nehmen. Richtiger ist

C++:
for(std::vector<datensatz>::size_type i = 0; i < daten.size(); ++i)


...wobei std::vector<datensatz> üblicherweise ein Alias von std::size_t ist, seinerseits ein vorzeichenloser Integer (unsigned int oder unsigned long).
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
15.05.2009, 04:04 Uhr
~xyz
Gast


Danke es hat funktioniert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


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: