Using ifstream to read floats

I am trying to read a series of floats from a .out file using ifstream, but if I output them later, they are not true.

This is my input code:

float x, y, z; ifstream table; table.open("Resources/bones.out"); if (table.fail()) { cout << "Can't open table" << endl; return ; } table >> x; table >> y; table >> z; cout << x << " " << y << " " << z << endl; table.close(); 

My input file:

 0.488454 0.510216 0.466979 0.487242 0.421347 0.472977 0.486773 0.371251 0.473103 ... 

Now for testing, I just read the first line in x y and z , and my output

 1 0 2 

Any ideas as to why I am not getting the correct conclusion?

+8
c ++ io ifstream
Feb 28 '14 at 16:33
source share
2 answers
 #include <fstream> #include <strtk.hpp> // http://www.partow.net/programming/strtk std::string filename("Resources/bones.out"); // assuming the file is text std::fstream fs; fs.open(filename.c_str(), std::ios::in); if(fs.fail()) return false; const char *whitespace = " \t\r\n\f"; std::string line; std::vector<float> floats; std::vector<std::string> strings; float x = 0.0, y = 0.0, z = 0.0; std::string xs, ys, zs; // process each line in turn while( std::getline(fs, line ) ) { // Removing beginning and ending whitespace // can prevent parsing problems from different line endings. // formerly accomplished with boost::algorithm::trim(line) strtk::remove_leading_trailing(whitespace, line); // strtk::parse combines multiple delimiters in these cases if( strtk::parse(line, whitespace, floats ) ) { std::cout << "succeed" << std::endl; // floats contains all the values on the in as floats } if( strtk::parse(line, whitespace, strings) ) { std::cout << "succeed" << std::endl; // strings contains all the values on the in line as strings } if( strtk::parse(line, whitespace, x, y, z) ) { std::cout << "succeed" << std::endl; // x,y,z contain the float values. parse fails if more than 3 floats are on the line } if( strtk::parse(line, whitespace, xs, ys, zs) ) { std::cout << "succeed" << std::endl; // xs,ys,zs contain the strings. parse fails if more than 3 strings are on the line } } 

Here is how I will resolve it. You can choose the method of data analysis.

+7
Feb 28 '14 at 18:33
source share

I have worked with this before, and something I would do is like the code below, where you read a text file line by line and use getline and line to translate twext into variables. You do not need to specify an array, as it is limited to elements, but uses a vector, and you can dynamically add it.

  string xs; string ys; string zs; ifstream infile; someArray[50]; infile.open("some file.txt"); if (!infile) { cout << "no good file failed! \n" << endl; } while (infile.good()) { for (int i = 0; i < 49; ++i) { getline(infile, xs); //Saves the line in xs. infile >> p[i].xs; getline(infile, ys, ','); infile >> p[i].ys; getline(infile, zs, ','); infile >> p[i].zs; } //infile >> p.fromFloor; */ } infile.close(); } 
0
Mar 01 '14 at 6:29
source share



All Articles