una txt texto plano matriz libreria leer guardarlo guardar escribir desde datos como arreglo archivos archivo c++

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.