Du hast bereits gesagt worden, über std::getline
, aber sie nicht erwähnt, ein Detail, dass Sie werden wahrscheinlich feststellen, nützlich zu analysieren welcher Charakter als Ende der Eingabe zu behandeln ist. Um Ihre Nummer zu lesen, können Sie verwenden:
std::string number;
std::string name;
std::getline(infile, number, ':');
std::getline(infile, name);
Dadurch werden die Daten stellen bis zu den ‚:‘ in number
, verwerfen die ‚:‘, und der Rest der Zeile in name
lesen.
Wenn Sie >>
verwenden, um die Daten zu lesen, können Sie das auch tun, aber es ist ein bisschen schwieriger und taucht in einen Bereich der Standardbibliothek ein, den die meisten Leute nie berühren. Ein Stream hat eine zugeordnete locale
, die für Dinge wie die Formatierung von Zahlen verwendet wird und (wichtig ist) zu bestimmen, was "White Space" ausmacht. Sie können Ihr eigenes Gebietsschema definieren, um ":" als Leerraum und den Leerraum ("") als nicht Leerraum zu definieren. Weisen Sie den Stream an, dieses Gebietsschema zu verwenden, damit Sie Ihre Daten direkt lesen können.
#include <locale>
#include <vector>
struct colonsep: std::ctype<char> {
colonsep(): std::ctype<char>(get_table()) {}
static std::ctype_base::mask const* get_table() {
static std::vector<std::ctype_base::mask>
rc(std::ctype<char>::table_size,std::ctype_base::mask());
rc[':'] = std::ctype_base::space;
rc['\n'] = std::ctype_base::space;
return &rc[0];
}
};
Nun, es zu benutzen, wir den Strom mit einem locale „durchtränken“:
#include <fstream>
#include <iterator>
#include <algorithm>
#include <iostream>
typedef std::pair<int, std::string> data;
namespace std {
std::istream &operator>>(std::istream &is, data &d) {
return is >> d.first >> d.second;
}
std::ostream &operator<<(std::ostream &os, data const &d) {
return os << d.first << ":" << d.second;
}
}
int main() {
std::ifstream infile("testfile.txt");
infile.imbue(std::locale(std::locale(), new colonsep));
std::vector<data> d;
std::copy(std::istream_iterator<data>(infile),
std::istream_iterator<data>(),
std::back_inserter(d));
// just for fun, sort the data to show we can manipulate it:
std::sort(d.begin(), d.end());
std::copy(d.begin(), d.end(), std::ostream_iterator<data>(std::cout, "\n"));
return 0;
}
Jetzt wissen Sie, warum , die Teil der Bibliothek wird so vernachlässigt. Theoretisch ist es großartig, die Standard-Bibliothek zu bekommen, um Ihre Arbeit für Sie zu erledigen - aber in der Tat ist es meistens einfacher, diese Art von Arbeit selbst zu erledigen.
Streams in C gefunden werden kann ++ ist eines der Dinge, die ich über C++ hassen. – AraK
Da ich neu in C++ bin, hatte ich gehofft, dass Streams eines dieser Dinge sind, die schließlich zu einer Offenbarung von "oooooh das ist schlau" führen, aber nach deinem Kommentar denke ich, dass das niemals passieren wird. :( – dreamlax