如何在c ++中将数据从文件读取到int / float值?

时间:2018-01-26 15:29:04

标签: c++ char int ifstream

可能已经问过这个问题了,我已经找到了类似的主题,但我仍然无法解决我的问题。 我有一个由IDL生成的数据文件,其中包含整数和浮点值。我想用C ++阅读这个数据文件。 我到目前为止做了什么:

fstream prjfile;
prjfile.open("fileName", ios::in|ios::ate);
if (prjfile.is_open() == false) {
    std::cout << "Cannot open project file\n";
}
else {
    std::vector <char> memPrj(0);
    std::cout << "project size" << prjfile.tellg() << std::endl;
    int sizePrj;
    sizePrj = prjfile.tellg();
    //store all values of the file in memPrj vector
    memPrj.resize(sizePrj);
    prjfile.seekg(0, std::ios::beg);
    prjfile.read(&memPrj[0], sizePrj);
    //now change the integer values to int
    vector<int> mask;
    //store the values in the mask vector
    mask.push_back(memPrj[0] - '0' + 48);
    mask.push_back(memPrj[1] - '0' + 48);
    mask.push_back(memPrj[2] - '0' + 48);
}

像这样我得到了值

memblockPrj[0] - '0' + 48 = -112
memblockPrj[1] - '0' + 48 = 0
and memblockPrj[2] - '0' + 48 = -112

虽然值应为:144,257,144

有谁知道我的错误在哪里? 数据的其余元素是浮点值。如何将char值转换为float?

提前致谢!

2 个答案:

答案 0 :(得分:0)

重复&gt;&gt;读入循环。

#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;
}

结果:

45.779999 67.900002 87.000000 34.889999 346.000000 0.980000

如果你确切知道文件中有多少元素,你可以链接&gt;&gt;操作者:

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;
}

答案 1 :(得分:0)

你让生活太复杂了。 这就是本质:

std::string text_line;
while (std::getline(prjFile, text_line))
{
  int value;
  std::istringstream text_line;
  text_line >> value;
  mask.push_back(value);
  std::string comma;
  std::getline(text_line, comma, ',');
  text_line >> value;
  mask.push_back(value);
  std::getline(text_line, comma, ',');
  text_line >> value;
  mask.push_back(value);
}

由于读取整数只会在遇到浮点数时读取小数点,其余字符将被跳过,直到下一个逗号。

<强> EDIT1:
另一种方法是将值读取为浮点,在附加到向量之前将它们转换为整数。