проблема с функцией getline () - PullRequest
       5

проблема с функцией getline ()

0 голосов
/ 14 октября 2010

Я новичок в C ++, и я пытаюсь использовать функцию getline () в первый раз. Когда я написал этот код, появилось 2 ошибки.

Что должен делать этот код? Предполагается прочитать 4 числа из read.txt, затем вычислить его, чтобы найти среднее значение и записать результат в output.txt

Все 4 цифры (в файле read.txt) расположены в отдельных строках, например:

6
12
15
19

Вот код:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

    int main () 
    {
     ifstream readFile;
        ofstream sendFile;
     readFile.open ("read.txt");
     sendFile.open ("output.txt");;

     float mean;
     int num, num2, num3, num4;
     getline(readFile, num), getline(readFile, num2), getline(readFile, num3), getline(readFile, num4); 

     readFile >> num >> num2 >> num3 >> num4;
     sendFile << "1. The mean of " << num << ", " << num2 << ", " << num3 << ", and " << num4 << "is " << (num + num2 + num3 + num4) / 4;

     readFile.close();
     sendFile.close();

      system ("PAUSE") ;
      return 0;
    }

Вот ошибки: IntelliSense: ни один экземпляр перегруженной функции «getline» не соответствует списку аргументов 20 IntelliSense: слишком мало аргументов в вызове функции 20

Ответы [ 3 ]

1 голос
/ 14 октября 2010

std::getline() принимает два аргумента: поток и объект std::string, в который нужно прочитать следующую строку (и необязательный третий аргумент, разделитель).Вы передаете int вместо std::string.

. Вам, вероятно, следует использовать обычное форматированное извлечение:

if (readFile >> num >> num2 >> num3 >> num4) {
    // extraction succeeded!
}
else {
    // extraction failed; handle the error here
}
0 голосов
/ 14 октября 2010

std :: getline - это полезный инструмент для чтения одной строки текста или чтения текста до определенного символа и записи его в std :: string, где его можно затем прочитать.По умолчанию в качестве разделителя используется символ новой строки, то есть '\ n', но вы можете изменить это.

Что касается использования потока для чтения ряда целых чисел, то выведите их среднее значение, почему бы просто не прочитать до концафайла, таким образом:

int count = 0, total = 0, num;
while( instr >> num )
{
  ++count;
  total += num;
}

float mean = (count > 0 ) ? total / num : std::numeric_limits<float>::quiet_NaN();
outstr << mean;

Вы можете сделать это функцией, взяв istream & instr и ostream & outstr

Предположим, теперь мы хотим изменить это, чтобы читать несколько строк, каждая счисла, разделенные пробелом или табуляцией.В нашем выводе мы пишем все средства в их собственной строке.

Теперь сделайте что-то вроде этого:

std::string line;
while( std::getline( bigInStr, line ) )
{
   std::istringstream iss(line);
   outputMean( iss, outstr );
   outstr << '\n';
}

, хотя вы можете не выводить NaN, а просто оставить эту строку пустойна выходе.Функция, вычисляющая среднее значение, вероятно, захочет использовать NaN в качестве возвращаемого значения, если она должна возвратить число с плавающей точкойМы могли бы вычислить дисперсию, асимметрию и эксцесс одновременно, если мы хотим при выполнении итерации.

Затем вы бы вывели их в виде нескольких значений в строке и вам пришлось бы выбрать свой собственный разделитель.В этом случае я предпочитаю использовать tab ('\ t').

_

0 голосов
/ 14 октября 2010

getline читает в std :: string, не может читать в int s. Просто используйте readFile >> num >> num2 >> num3 >> num4;, как у вас уже есть, и удалите строку с getline s.

С другой стороны, вам не нужно явно закрывать файлы здесь, поскольку деструкторы объектов файлового потока позаботятся об этом за вас.

...