C ++ getline двойная ошибка

0

поэтому я написал код выше, и у меня есть эта ошибка ниже. Я вижу отсюда, что getline работает только с char, я пытался написать его другими способами, используя cin.. но это stll не работает, никаких sugestions?

Мне действительно нужна помощь в этом.

#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 ==========
  • 2
    попробуйте класс stringstream и прочитайте в потоке. вам нужно преобразовать поток в двойной. Вы не можете использовать getline на двойной.
  • 0
    Примечание. Я переформатировал код, чтобы сделать его более читабельным. Это означает, что номер строки, указанный в сообщении об ошибке, не является точным.
Показать ещё 6 комментариев
Теги:
getline

2 ответа

1

Как указывали другие: getline не подходит для double s. Если файл содержит несколько удвоений, разделенных пробелами или символами новой строки, вы можете использовать std::istream::operator>>(double&) неявно, используя std::istream_iterator<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;
}
0

Взгляните на ссылку getstream getstream: std :: istream :: getline. И, как уже прокомментировали другие, метод getline ожидает указатель на символ, и сколько символов нужно читать в эту память. После получения строки необходимо будет затем преобразовать данные символа в двойное и сохранить соответствующим образом.

В качестве альтернативы, в зависимости от того, как сконструировано содержимое входного файла, вы можете использовать оператор потокового ввода для автоматического преобразования входной строки в заданный элемент двойного массива. Подробнее здесь: std :: istream :: operator >>. Это может хорошо работать в отношении массива размера времени компиляции, если количество строк входного файла является постоянным или меньше, чем размер выделенного массива. Если нет, тогда нужно будет использовать что-то лучше, как вектор. Сначала прочитайте одну строку в локальной двойной переменной, затем вызовите push_back на вектор, чтобы сохранить значение для последующего использования. Затем перейдите к следующей строке из входного файла.

Чтобы уменьшить путаницу, не рекомендуется смешивать строчную обработку библиотеки C с потоками C++. Существует больше возможностей отслеживать и не создавать переполнения буфера при попытке использовать обе библиотеки в одном дизайне. Другими словами, играйте в нее безопасно, концентрируясь на одной библиотеке. Если целью является C++, то iostream, sstrstream, ifstream, ostream и т.д. Являются теми, которые вы хотите.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню