separados - Leer datos numéricos de un archivo de texto en C++
libreria fstream c++ (4)
Por ejemplo, si los datos en un archivo de texto externo son así:
45.78 67.90 87
34.89 346 0.98
¿Cómo puedo leer este archivo de texto y asignar cada número a una variable en c ++? Utilizando ifstream, puedo abrir el archivo de texto y asignar el primer número a una variable, pero no sé cómo leer el siguiente número después de los espacios.
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
float a;
ifstream myfile;
myfile.open("data.txt");
myfile >> a;
cout << a;
myfile.close();
system("pause");
return 0;
}
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int data[6], a, b, c, d, e, f;
ifstream myfile;
myfile.open("a.txt");
for(int i = 0; i << 6; i++)
myfile >> data[i];
myfile.close();
a = data[0];
b = data[1];
c = data[2];
d = data[3];
e = data[4];
f = data[5];
cout << a << "/t" << b << "/t" << c << "/t" << d << "/t" << e << "/t" << f << "/n";
system("pause");
return 0;
}
El operador de entrada para el número omite el espacio en blanco inicial, por lo que puede leer el número en un bucle:
while (myfile >> a)
{
// ...
}
Puede depender, especialmente si su archivo tendrá la misma cantidad de elementos en cada fila o no. Si lo hace, entonces probablemente desee una clase de matriz 2D de algún tipo, generalmente algo como esto:
class array2D {
std::vector<double> data;
size_t columns;
public:
array2D(size_t x, size_t y) : columns(x), data(x*y) {}
double &operator(size_t x, size_t y) {
return data[y*columns+x];
}
};
Tenga en cuenta que tal como está escrito, esto supone que conoce el tamaño que necesitará por adelantado. Eso se puede evitar, pero el código se vuelve un poco más grande y más complejo.
En cualquier caso, para leer los números y mantener la estructura original, normalmente leería una línea a la vez en una cadena, luego usaría un flujo de cuerda para leer los números de la línea. Esto le permite almacenar los datos de cada línea en una fila separada en su matriz.
Si no conoce el tamaño antes de tiempo o (especialmente) si las filas diferentes pueden no contener la misma cantidad de números:
11 12 13
23 34 56 78
Es posible que desee utilizar un std::vector<std::vector<double> >
lugar. Esto sí impone una sobrecarga, pero si las diferentes filas pueden tener diferentes tamaños, es una manera fácil de hacer el trabajo.
std::vector<std::vector<double> > numbers;
std::string temp;
while (std::getline(infile, temp)) {
std::istringstream buffer(temp);
std::vector<double> line((std::istream_iterator<double>(buffer)),
std::istream_iterator<double>());
numbers.push_back(line);
}
... o, con un compilador moderno (C ++ 11), puede usar corchetes para la inicialización de la línea:
std::vector<double> line{std::istream_iterator<double>(buffer),
std::istream_iterator<double>()};
Repetir >> lecturas en bucle.
#include <iostream>
#include <fstream>
int main(int argc, char * argv[])
{
std::fstream myfile("D://data.txt", std::ios_base::in);
float a;
while (myfile >> a)
{
printf("%f ", a);
}
getchar();
return 0;
}
Resultado:
45.779999 67.900002 87.000000 34.889999 346.000000 0.980000
Si sabe exactamente cuántos elementos hay en un archivo, puede encadenar >> operador:
int main(int argc, char * argv[])
{
std::fstream myfile("D://data.txt", std::ios_base::in);
float a, b, c, d, e, f;
myfile >> a >> b >> c >> d >> e >> f;
printf("%f/t%f/t%f/t%f/t%f/t%f/n", a, b, c, d, e, f);
getchar();
return 0;
}
Editar: En respuesta a tus comentarios en la pregunta principal.
Tienes dos opciones.
- Puede ejecutar el código anterior en un bucle (o dos bucles) y descartar un número definido de valores; por ejemplo, si necesita el valor en el punto (97, 60), debe omitir 5996 (= 60 * 100 + 96 ) valores y use el último. Esto funcionará si solo está interesado en el valor especificado.
- Puede cargar los datos en una matriz, como lo sugirió Jerry Coffin. Él ya te dio bastante buena clase, lo que resolverá el problema. Alternativamente, puede usar una matriz simple para almacenar los datos.
Editar: cómo saltear valores en el archivo
Para elegir el valor 1234º, use el siguiente código:
int skipped = 1233;
for (int i = 0; i < skipped; i++)
{
float tmp;
myfile >> tmp;
}
myfile >> value;
puedes leer y escribir por separado como otros. Pero si quieres escribir en la misma, podrías intentar con esto:
#include <iostream>
#include <fstream>
using namespace std;
int main() {
double data[size of your data];
std::ifstream input("file.txt");
for (int i = 0; i < size of your data; i++) {
input >> data[i];
std::cout<< data[i]<<std::endl;
}
}