【问题标题】:C++ getline double errorC ++ getline双重错误
【发布时间】:2014-04-26 13:24:58
【问题描述】:

所以我写了上面的代码,下面有这个错误。我从这里看到 getline 仅适用于 char,我尝试以其他方式编写它,使用 cin.. 但它仍然不起作用,有什么建议吗?

我真的需要这方面的帮助..

#include <iostream>
#include <fstream>
#include <cstring>
#include <string>
#include <sstream>

using namespace std;

int main()
{
    int n;
    double sum[100];
    double source[100];
    int broj;

    ifstream ulaz("dat.txt", ios::in);
    if(ulaz.is_open())
    {
        while(!ulaz.eof())
        {
            cin.sync();
            cin.clear();
            ulaz.getline(source,sizeof(source));
            broj++;
        }
    }
    ulaz.close();

    cout<<"Insert number of days:"<<endl;
    cin>>n;

    for(int i=0; i<broj; i++)
    {
        sum[i]=1000*source[i];
        sum[i]=sum[i]/source[i+1];
    }

    cout<<"Result: "<<sum<<endl;

    system("pause");
    return 0;
}

1>------ Build started: Project: Zadaci_za_1l, Configuration: Debug Win32 ------
1>  zadatak2.cpp
1>c:\users\****.cpp(23): error C2664: 'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::getline(_Elem *,std::streamsize)' : cannot convert parameter 1 from 'double [100]' to 'char *'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

【问题讨论】:

  • 尝试 stringstream 类,并读入流。您需要将流转换为双倍。你不能在 double 上使用 getline。
  • 注意:我已重新格式化代码以提高可读性。这意味着错误消息中引用的行号不准确。
  • ulaz.getline 从ulaz 获取一行并将其放入第一个参数指向的char 数组中,将类型double[] 放在那里没有任何意义。跨度>
  • 另外,你看过这样的问题吗? stackoverflow.com/questions/2615078/…
  • 您可能迟早会发现while(!ulaz.eof()) is wrong.

标签: c++ getline


【解决方案1】:

正如其他人指出的那样:getline 不适合doubles。 如果您的文件包含多个双精度,由空格或换行符分隔,您可以使用 std::istream_iterator&lt;double&gt; 隐式使用 std::istream::operator&gt;&gt;(double&amp;)。 此外,如果您想处理灵活数量的值,请不要使用 C 样式的数组,而是使用向量。

从文件data.txt(仅包含双精度数)读取双精度值到向量中的代码,将它们相加可能看起来像

#include <fstream>
#include <vector>
#include <string>
#include <iostream>
#include <iterator>

std::vector<double> dv_from_file(std::string const & filename)
{
  std::ifstream input(filename.c_str(), std::ios_base::in);
  std::vector<double> data;
  if (input.good())
  {
    std::copy(std::istream_iterator<double>(input),
      std::istream_iterator<double>(),
      std::back_inserter(data));
  }
  return data;
}

int main(void)
{
  std::vector<double> source(r_dv_from_file("data.txt"));
  std::vector<double>::size_type const N(source.size());
  double sum(0.0);
  for (auto value : source) sum += value;
  std::cout << "File contains " << N << " elements." << std::endl;
  std::cout << "Sum of all elements is: " << sum << std::endl;
}

【讨论】:

    【解决方案2】:

    在此处查看 fstream getline 参考:std::istream::getline。正如其他人已经评论的那样,getline 方法需要一个指向字符的指针,以及要读入该内存的字符数。获得该行后,需要将字符数据转换为双精度并适当存储。

    或者,根据输入文件内容的构造方式,您可以使用输入流操作符自动将输入行转换为给定的双精度数组元素。更多细节在这里:std::istream::operator>>。如果输入文件行数恒定或小于分配的数组大小,这对于编译时大小的数组可以很好地工作。如果没有,那么将有必要使用更好的东西,比如矢量。首先将单行读入局部双精度变量,然后在向量上调用 push_back 以存储值以备后用。然后从输入文件继续到下一行。

    为帮助减少混淆,不建议将 C 库字符串处理与 C++ 流混合使用。当尝试在同一设计中使用这两个库时,还有更多需要跟踪并且不会引入缓冲区溢出。换句话说,通过专注于单个库来确保安全。如果目标是 C++,那么 iostream、sstrstream、ifstream、ostream 等就是你想要的。

    【讨论】:

      猜你喜欢
      • 2011-07-15
      • 2011-01-21
      • 2013-12-13
      • 1970-01-01
      • 2014-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多