c++ - txt - leer un archivo y guardarlo en un arreglo c
Leer nĂºmeros enteros de un archivo de texto con C++ ifstream (2)
El idioma estándar de lectura de línea:
#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
}
Aquí hay una versión de una línea que usa un bucle for
. Necesitamos una construcción auxiliar (¡créditos para @ Luc Danton !) Que haga lo opuesto a 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;
}
Quiero leer la información de adyacencia del gráfico de un archivo de texto y almacenarla en un vector.
El archivo tiene un número arbitrario de líneas.
cada línea tiene un número arbitrario de enteros que terminan con ''/ n''
por ejemplo,
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
Si uso getline () para leer una línea a la vez, ¿cómo analizo la línea (ya que cada línea tiene un número variable de enteros)?
¿Alguna sugerencia?
Primero lea una línea usando la función std::getline
, luego use std::stringstream
para leer los enteros de la línea como:
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);
}
También puedes escribir el bucle-cuerpo como:
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);
}
Esto parece más corto, y mejor. O fusionar las dos últimas líneas:
while(std::getline(file, line))
{
std::stringstream ss(line);
std::istream_iterator<int> begin(ss), end;
vv.push_back(std::vector<int>(begin, end));
}
Ahora no lo hagas más corto, ya que se vería feo.