2015-11-09 5 views
-1

У меня есть следующий файл text.txt, где первый столбец указывает пациента #:Количество вхождений в файле

1 325 160 2.0 
1 600 100 6.2 
2 325 220 1.0 
3 600 200 4.4 
4 325 100 3.0 
4 325 88 3.2 
2 600 200 3.3 
2 325 100 3.3 
4 600 210 3.4 
5 325 105 3.5 
1 600 110 6.0 
3 325 100 3.1 
2 600 120 5.5 
2 600 125 5.5 
5 120 60 2.2 
2 325 100 3.4 

Я хочу написать программу, где пользователь может ввести пациента # и функция будет укажите количество раз, когда номер пациента указан в файле, но я не могу понять его. Вот то, что я до сих пор:

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


bool analyzeData(int patientNum, int *numMeasurements); 


int main() 
{ 
    int patientNum; 
    char option; 
    int numMeasurements; 

    do 
    { 
    cout << "\nNew Pain Drug - Half-Life Determination\n"; 
    cout << "---------------------------------------\n"; 
    cout << " [P] - Patient Summary\n"; 
    cout << " [H] - Highest two half-lifes\n"; 
    cout << " [X] - to Exit\n"; 
    cout << "\nEnter Option: "; 
    cin >> option; 

    switch (option) 
    { 
    case 'p': 
     cout << "Enter patient number (1-5): "; 
     cin >> patientNum; 
     analyzeData(patientNum, &numMeasurements); 
     cout <<"num=" << numMeasurements<< endl; 
     break; 

    case 'h': 
     break; 

    case 'x': option = false; 
     break; 

    default: cout << "Invalid option entered.\n"; 
    } 
    } 
    while (option); 

} 
    bool analyzeData(int patientNum, int *numMeasurements) 
{ 
    double C0, Ct, t; 


    int patient; 
    ifstream fin; 
    fin.open ("Text.txt"); 

    if (fin) 
{ 
    while (fin >> patient >> C0 >> Ct >> t) 
    { 
     if (patient == patientNum) 
     { 
      bool analyzeData = true; 

      for (numMeasurements=0; patient != patientNum; numMeasurements++) 
       *numMeasurements; 
     } 
    } 
} 
    else 
{ 
    cout << "Error\n"; 
} 
    fin.close(); 
    return analyzeData; 

} 

Когда пациент # = 1, то функция numMeasurements в настоящее время выводит значение -858993460, что я знаю, это не так. Вы знаете, что я делаю неправильно?

+3

И? На самом деле вы не задали вопрос. – NathanOliver

+0

Итак, каков ваш вопрос, точно? –

+0

@NathanOliver жаль, что я отредактировал его, чтобы включить мой вопрос – lockeal

ответ

0

К тому времени, когда эта линия будет достигнута, пациент == patientNum, поэтому он никогда не войдет в цикл. numMeasurements никогда не инициализируется, а analysisData возвращает true.

for (numMeasurements=0; patient != patientNum; numMeasurements++) 
      *numMeasurements; 

Я не уверен, для чего нужен цикл for, но вы должны проверить эту часть.

1

В функции analyzeData переменная numMeasurements является указателем неинициализированных данных. Если вы использовали его, например, (*numMeasurements)++ значит у вас было бы undefined поведение.

Однако, вы делаете не, но вместо этого вы ничего не делаете с указателем. Вы сделать использовать его в петле

for (numMeasurements=0; patient != patientNum; numMeasurements++) 
    *numMeasurements; 

но цикл не на самом деле изменить то, что numMeasurementsпервоначально указал. Вместо этого этот цикл инициализирует указатель так, чтобы он указывал на 0, который в C++ является нулевым указателем, и вы увеличиваете указатель (а не на то, на что указывает), а в теле цикла вы читаете то, что указывает numMeasurements, но отбрасываете результаты (я не уверен, что это действительно неопределенное поведение или нет). Возможно, компилятор оптимизирует весь цикл.

Это возвращает нас к функции main, где numMeasurements по-прежнему неинициализирован. И затем вы печатаете значение numMeasurements, но значение равно неопределенным (потому что вы его не инициализировали), а затем вы получаете неопределенное поведение.

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