我有以下文件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,我知道它不对。你知道我做错了吗?
答案 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循环是什么,但是你应该检查这部分。