如何将预类型化文件转换为并行数组并在 c++ 中找到最大的数字

How do you turn a pre typed file into parallel arrays and find the largest number in c++?

本文关键字:c++ 数字 数组 类型化 文件 并行 转换      更新时间:2023-10-16

对于我的类,我们必须获取他设置的文件并将其设置为三个并行数组。然后遍历数组并找到最大值并将其输出到文件中。这就是我到目前为止所写的。

void highScore(string x, string y)
{
const int sizeOfArray = 10;
string name[sizeOfArray];
int idNum[sizeOfArray];
float balance[sizeOfArray];
float highBalance = 0;
int highId = 0;
string highName;
ifstream InFile(x.c_str());
ofstream OFile(y.c_str(), ios::app);
for(int i = 0; i < sizeOfArray; i++)
{
    getline(InFile, name[i], 'n');
    InFile >> idNum[i] >> balance[i];
}
for(int i = 0; i < sizeOfArray; i++)
{
    if(balance[i] > highBalance)
    {
        highBalance = balance[i];
        highName = name[i];
        highId = idNum[i];
    }
}
OFile << left;
OFile << "Larger Balance:" << endl;
OFile << "ID #     NAME                     BALANCE DUE" << endl;
OFile << "----     --------------------     -----------" << endl;
OFile << setw(9) << highId << setw(25) << highName << "$";
OFile << left;
OFile << setw(10) << highBalance << endl;
}

这是我们从中获取数据的文件。

Jean Rousseau
1001 15.50
Steve Woolston
1002 1423.20
Michele Rousseau
1005 52.75
Pete McBride
1007 500.32
Florence Rousseau
1010 1323.33
Lisa Covi
1009 332.35
Don McBride
1003 12.32
Chris Carroll
1008 32.35
Yolanda Agredano
1004 356.00
Sally Sleeper
1006 32.36

最终结果是支持看起来像。

Larger Balance:
ID # NAME BALANCE DUE
---- -------------------- -----------
1002 Steve Woolston $ 1423.20

提前谢谢你们。

你的代码看起来不错。 我看到的唯一问题是你的输入循环:

for(int i = 0; i < sizeOfArray; i++)
{
    getline(InFile, name[i], 'n');
    InFile >> idNum[i] >> balance[i];
}

让我们以字节为单位布置文件(我将使用 n 作为换行符(:

Jean Rousseaun1001 15.50nSteve Woolstonn1002 1423.20n...

现在,这是您的文件指针在循环第一次迭代后结束的地方:

Jean Rousseaun1001 15.50nSteve Woolstonn1002 1423.20n...
                         ^--HERE

由于n实际上分隔了数字输入,因此不会从流中删除该字符。 因此,下次循环时,您调用getline,就会发生这种情况:

Jean Rousseaun1001 15.50nSteve Woolstonn1002 1423.20n...
                           ^--HERE

哇,你只是读了一个空行! 现在,当您尝试输入两个数值时,它会失败,因为没有整数或浮点值以 S 开头。 但是现在,您定位正确,因此第三次循环将再次工作。

输入后,数组可能如下所示:

    name                    idNum         balance
0   "Jean Rousseau"         1001          15.5
1   ""                      -17733678     1.5944e-5
2   "Steve Woolston"        1002          1423.2
3   ""                      499911200     7.773883e50            
4   "Michele Rousseau"      1005          52.75
...
etc

问题是您假设索引 1 处的数组具有有效数字。 由于输入实际上失败,因此这些值未初始化。 它们只包含程序运行时内存中的任何垃圾。 因此,其中一个可能会被选为最高余额,并且将与您阅读的空名称配对。

简单的解决方案是跳过该行的其余部分(您应该在源文件中包含<limits>(。

getline(InFile, name[i], 'n');
InFile >> idNum[i] >> balance[i];
InFile.ignore(std::numeric_limits<std::streamsize>::max(), 'n');

或者,您可以通过使用getline后跟字符串流来确保正确的基于行的行为:

getline( InFile, name[i] );
string record;
getline( InFile, record );
istringstream iss( record );
iss >> idNum[i] >> balance[i];