2010-10-14 3 views
0

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

Что должен делать этот код? Предполагается прочитать 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

+0

Почему вы используете оператор запятой для разделения вызовов на 'getline()'? –

ответ

1

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

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

if (readFile >> num >> num2 >> num3 >> num4) { 
    // extraction succeeded! 
} 
else { 
    // extraction failed; handle the error here 
} 
+0

Теперь я знаю, что getline() берет только строки, спасибо! – Evan

+0

Обратите внимание, что если есть ошибка чтения 2-го, 3-го или 4-го номеров, не будет возможности сказать, так как выражение будет терпеть неудачу одинаково для каждого случая. Я предлагаю читать каждый номер отдельно и тестировать на отказ. –

+1

@Thomas: Это зависит от точности обработки ошибок, которая необходима. Довольно часто достаточно использовать обработку ошибок «все или ничего», особенно при операциях ввода. –

0

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

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

+0

О, ладно, спасибо большое! Сейчас это работает. – Evan

0

std :: getline - полезный инструмент для чтения одной строки текста или чтения текста до определенного символа и записи его в std :: string, где он затем может быть прочитан далее. По умолчанию в качестве разделителя используется newline i.e. \ 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 в качестве возвращаемого значения, если оно должно возвращать float. Мы могли бы рассчитать дисперсию, асимметрию и эксцесс в то же время, если хотим, итерации.

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

+0

Должно быть 'quiet_NaN' вместо' quiet-NaN'. – usta

+0

Да, оверло, на британской клавиатуре, по крайней мере, они находятся на одном ключе с _, требующим сдвига. Если у вас есть функция для вычисления среднего значения, то с помощью 0 записей вы, вероятно, захотите вернуть какой-то NaN, но если вы печатаете, вы, вероятно, захотите оставить эту строку пустой. – CashCow

Смежные вопросы