【问题标题】:Reading floating point numbers from text file and copying to a vector of floating point numbers从文本文件中读取浮点数并复制到浮点数向量
【发布时间】:2014-05-27 23:50:38
【问题描述】:

我需要用 C++ 编写一个代码,从 逗号 分隔的文本文件中读取 浮点数 并复制到 浮点数的向量。文本文件包含数千个用逗号分隔的浮点整数(如 1、1、69.8、110、0、-1.8、-1.8、0、120、0、0、0、0、3.23、 )。我尝试使用 getline(),但我想它是为了将文本文件作为字符串读取,并保存在字符串向量中,而不是浮点数。任何人都可以帮我解决这个问题

以下代码没有按我预期的方式工作

vector<float> ReplayBuffer;
ifstream in;
in.open("fileName.txt");
if(in.is_open())
{
    in.setf(ios::fixed);
    in.precision(3);

   in.seekg(0,ios::end);
   fileSizes = in.tellg();

   in.seekg(0,ios::beg);
   float number = 0;
   for(int i = 0; i<fileSizes/sizeof(float);i++)
   {
    getline(in, ReplayBuffer[i],', ');
   }

   for(int i = 0;i<ReplayBuffer.size();i++)
    {  cout<<ReplayBuffer[i]<<" , "<<endl; }
   in.close();
    }
}

【问题讨论】:

  • 您可以直接从输入流中读取浮点数:`in >> ReplayBuffer"。您需要注意跳过逗号。
  • C 和 C++ 不是同一种语言,所以如果它与 C 没有任何关系,请不要将其标记为 C。
  • 更正。文件中没有浮点数。您有带有小数部分的 ASCII 格式的十进制数。您需要将它们转换为浮点数。

标签: c++ vector text-files


【解决方案1】:

最简单的方法也许是

for (std::string f; getline(in, f, ',');)
  ReplayBuffer.push_back(std::stof(f));

如果文件中的浮点数可能无效,您需要将其包装在 try - catch 块中。

然后您的代码可以简化为类似

vector<float> ReplayBuffer;
ifstream in("fileName.txt");

for (std::string f; getline(in, f, ',');)
  ReplayBuffer.push_back(std::stof(f));

for (auto f : ReplayBuffer)
  std::cout << f << " , ";

fixedprecision 仅影响输出(除非您使用自定义的 num_get facet),即使您要保留原始代码,这两行也无济于事。

【讨论】:

  • 建议的代码,似乎不起作用。显示错误 error C2780: 'std::basic_istream<_elem> &std::getline(std::basic_istream<_elem> &,std ::basic_string<_elem> &)' : 需要 2 个参数 - 提供 3 个
  • @sarath 要么你没有包含string,要么你的编译器不支持getline 的字符串重载,这不太可能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
  • 2012-01-15
  • 2011-02-15
  • 1970-01-01
相关资源
最近更新 更多