簡體   English   中英

C ++ getline雙重錯誤

[英]C++ getline double error

所以我在上面寫了代碼,下面有這個錯誤。 我從這里看到getline僅適用於char,我嘗試用其他方式編寫它,使用cin ..但它stll不起作用,有任何提示嗎?

我真的需要幫助。

#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 ==========

正如其他人指出的那樣: getline不適合double 如果文件包含多個由空格或換行符分隔的雙打,則可以通過使用std::istream_iterator<double>隱式使用std::istream::operator>>(double&) 此外,如果要處理數量靈活的值,請不要使用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;
}

看一下fstream getline參考: std :: istream :: getline 正如其他人已經評論過的那樣,getline方法期望一個指向字符的指針,以及讀入該內存的字符數。 在獲得該行之后,有必要將字符數據轉換為double並適當地存儲。

或者,根據輸入文件內容的構造方式,您可以使用輸入流運算符將輸入行自動轉換為給定的雙數組元素。 更多詳細信息在這里: std :: istream :: operator >> 如果輸入文件行數恆定或小於分配的數組大小,則這對於編譯時大小的數組可以很好地工作。 如果沒有,那么有必要使用更好的矢量。 首先將一行讀入局部double變量,然后在向量上調用push_back來存儲該值以備后用。 然后從輸入文件轉到下一行。

為了幫助減少混淆,不建議將C庫字符串處理與C ++流混合使用。 嘗試在同一設計中使用兩個庫時,還有更多要跟蹤的地方,並且不會引起緩沖區溢出。 換句話說,通過專注於單個庫可以安全地進行操作。 如果目標是C ++,那么您想要的就是iostream,sstrstream,ifstream,ostream等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM