multidimensionales - matrices en c++
C++ lee los valores de flotación de.txt y los coloca en una matriz 2D de tamaño desconocido (2)
Creo que esto podría ayudarte. Use un vector de un vector de tipo float
ya que no tiene conocimiento de la cantidad de elementos. Este código supone que tiene un número de float
separado por espacio en cada línea.
fstream fs;
fs.open("abc.txt",ios::in);
vector<vector<float>> floatVec;
string strFloat;
float fNum;
int counter = 0;
while(getline(fs,strFloat))
{
std::stringstream linestream(strFloat);
floatVec.push_back(std::vector<float>());
while(linestream>>fNum)
floatVec[counter].push_back(fNum);
++counter;
}
En C ++, quiero leer un archivo de texto con columnas de flotadores y ponerlos en una matriz 2d.
La primera línea será la primera columna y así sucesivamente.
El tamaño de la matriz es desconocido, depende de las líneas y columnas que pueden variar.
Lo he intentado con "getline", "inFile >>", pero todos los cambios que he realizado tienen algunos problemas.
Por ejemplo, ¿hay alguna manera de eliminar las filas / líneas innecesarias después de que los valores estén allí?
El archivo se ve así (+/-):
- caracteres "/ t" caracteres "/ t" caracteres "/ n"
- flotar "/ t" flotar "/ t" flotar "/ t" flotar "/ n"
- flotar "/ t" flotar "/ t" flotar "/ t" flotar "/ n"
- flotar "/ t" flotar "/ t" flotar "/ t" flotar "/ n"
Gracias
Hasta ahora tengo esto:
int ReadFromFile(){
ifstream inFile;
ofstream outFile;
int nLinActual = 0;
const int nCol = 9;
const int nLin = 10;
// open file for reading
inFile.open("values.txt");
// checks if file opened
if(inFile.fail()) {
cout << "error loading .txt file reading" << endl;
return 1;
}
// open file for writing
outFile.open ("outArray.txt");
// checks if file opened
if(outFile.fail()) {
cout << "error loading .txt file for writing" << endl;
return 1;
}
// Doesn''t read the first line
string dummyLine, dummyLine2, dummyLine3;
getline(inFile, dummyLine);
// Declares Array
float values[nLin][nCol];
//Fill Array with -1
for(int l=0; l<nLin; l++)
for(int c=0; c<nCol; c++)
values[l][c] = -1;
// reads file to end of *file*, not line
while(!inFile.eof()) {
for (int i=0; i<nCol; i++) {
inFile >> values[i][nLinActual];
}
i=0;
++nLinActual;
}
// Check what''s happening
cout << endl;
for(int l=0; l<nLin; l++){
for(int c=0; c<nCol; c++){
cout << values[l][c] << "/t";
outFile << values[l][c] << "/t";
}
cout << endl;
outFile << endl;
}
inFile.close();
outFile.close();
return 0;
}
La forma más fácil es usar un vector:
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <fstream>
int main()
{
std::fstream in("in.txt");
std::string line;
std::vector<std::vector<float>> v;
int i = 0;
while (std::getline(in, line))
{
float value;
std::stringstream ss(line);
v.push_back(std::vector<float>());
while (ss >> value)
{
v[i].push_back(value);
}
++i;
}
}
Actualización: dijiste que lo necesitabas con matrices de C en bruto. Claro, esto se puede hacer:
int main()
{
std::ifstream in("in.txt");
std::string line;
float v[9][10];
int i = 0, k = 0;
while (std::getline(in, line))
{
float value;
int k = 0;
std::stringstream ss(line);
while (ss >> value)
{
v[i][k] = value;
++k;
}
++i;
}
}