【问题标题】:How to read data from file to int/float values in c++?如何在 C++ 中将数据从文件读取到 int/float 值?
【发布时间】:2018-01-26 15:29:04
【问题描述】:

可能这个问题已经被问过了,我已经找到了类似的主题,但我仍然无法解决我的问题。 我有一个由 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 值转换为浮点数?

提前致谢!

【问题讨论】:

  • 是的,你是对的,已经有很多类似的问题了。在互联网上搜索“StackOverflow c++ 读取文件逗号分隔”。
  • IDL=?在这种情况下
  • " 我已经找到了类似的主题,但我仍然无法解决我的问题" 是的,在不知道您对它们到底有什么困惑的情况下,我们无法可靠地提供帮助您无需重复现有的 20,000 个答案,也不会进一步加深您的理解。然后是下一个人的 20,001。请更清楚地说明您在现有指南中没有了解的内容。
  • 你为什么要减去'0'并加上48?我相信 48 是 '0' 的 ASCII 值。

标签: c++ char int ifstream


【解决方案1】:

你把生活弄得太复杂了。 本质是这样的:

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

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

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

【讨论】:

    【解决方案2】:

    重复>>循环读取。

    #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
    

    如果你确切知道一个文件有多少个元素,你可以链接>>操作符:

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

    【讨论】:

    • 为什么在 c++ 中使用printf() 输出?
    • 你为什么使用printf(C流)和C++流(fstream)?你应该坚持一种流风格。
    • 您的示例扩展得不是很好。如果我知道一个文件中有 1000 个元素,我不会使用一行来读取所有 1000 个元素。考虑一个循环和std::vector
    • 另外,OP 的数据文件有逗号。您的解决方案不处理逗号。
    猜你喜欢
    • 2015-01-05
    • 2013-02-16
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    相关资源
    最近更新 更多