文件中出现的次数

时间:2015-11-09 13:29:07

标签: c++ function file visual-c++ menu

我有以下文件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,我知道它不对。你知道我做错了吗?

2 个答案:

答案 0 :(得分:1)

analyzeData函数中,变量numMeasurements是未初始化的指针数据。如果您使用它,例如(*numMeasurements)++然后你会有未定义的行为

但是,你这样做,而你根本不对指针做任何事情。你在循环中使用它

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

但该循环实际上并未修改numMeasurements 最初指向的内容。相反,循环初始化指针指向0,它在C ++中是空指针,并且您递增指针(而不是它指向的指针),并在循环体中读取numMeasurements指向的内容但是抛弃结果(我不确定这是否真的是未定义的行为)。编译器可能会优化整个循环。

这导致我们回到main函数,其中numMeasurements仍然未初始化。然后打印numMeasurements的值,但值为 indeterminate (因为您尚未初始化它),然后您得到未定义的行为。

答案 1 :(得分:0)

到达此行时,患者== patientNum,因此它永远不会进入循环。 numMeasurements从未初始化,analyzeData返回true。

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

我不确定for循环是什么,但是你应该检查这部分。