
esneuling
Ich möchte Graph-Adjazenzinformationen aus einer Textdatei lesen und in einem Vektor speichern.
-
Die Datei hat eine beliebige Anzahl von Zeilen
-
Jede Zeile hat eine beliebige Anzahl von Ganzzahlen, die mit ‘\n’ enden
zum Beispiel,
First line:
0 1 4
Second line:
1 0 4 3 2
Thrid line:
2 1 3
Fourth line:
3 1 2 4
Fifth line:
4 0 1 3
Wenn ich getline() verwende, um jeweils eine Zeile zu lesen, wie kann ich die Zeile analysieren (da jede Zeile eine variable Anzahl von Ganzzahlen hat)?
Irgendwelche Vorschläge?

Kerrek SB
Die Standardzeilen-Lesesprache:
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
std::ifstream infile("thefile.txt");
std::string line;
while (std::getline(infile, line))
{
std::istringstream iss(line);
int n;
std::vector<int> v;
while (iss >> n)
{
v.push_back(n);
}
// do something useful with v
}
Hier ist eine einzeilige Version mit a for
Schleife. Wir brauchen eine Hilfskonstruktion (Dank an @Luc Danton!), die das Gegenteil von tut std::move
:
namespace std
{
template <typename T> T & stay(T && t) { return t; }
}
int main()
{
std::vector<std::vector<int>> vv;
for (std::string line;
std::getline(std::cin, line);
vv.push_back(std::vector<int>(std::istream_iterator<int>(std::stay(std::istringstream(line))),
std::istream_iterator<int>())
)
) { }
std::cout << vv << std::endl;
}

Nawaz
Lesen Sie zuerst eine Zeile mit std::getline
Funktion, dann verwenden std::stringstream
um die ganzen Zahlen aus der Zeile zu lesen als:
std::ifstream file("input.txt");
std::vector<std::vector<int>> vv;
std::string line;
while(std::getline(file, line))
{
std::stringstream ss(line);
int i;
std::vector<int> v;
while( ss >> i )
v.push_back(i);
vv.push_back(v);
}
Sie können den Loop-Body auch schreiben als:
while(std::getline(file, line))
{
std::stringstream ss(line);
std::istream_iterator<int> begin(ss), end;
std::vector<int> v(begin, end);
vv.push_back(v);
}
Das sieht kürzer und besser aus. Oder führen Sie die letzten beiden Zeilen zusammen:
while(std::getline(file, line))
{
std::stringstream ss(line);
std::istream_iterator<int> begin(ss), end;
vv.push_back(std::vector<int>(begin, end));
}
Machen Sie es jetzt nicht kürzer, da es hässlich aussehen würde.
10131600cookie-checkLesen Sie ganze Zahlen aus einer Textdatei mit C++ ifstreamyes
Sie könnten auf folgendes verweisen: stackoverflow.com/questions/236129/how-to-split-a-string-in-c
– Ryan Li
14. November 2011 um 3:00 Uhr