我是c++的新手,我需要使用函数将数据(一系列整数)从文件加载到多个单维并行数组中。该程序是模拟跟踪棒球统计,文件应该从功能打开。我可以在主函数中加载数组没有问题,但是当我使用辅助函数设置时,我最终会为数组的第一个元素和第一个元素之外的所有元素获得垃圾输入,除非我在主函数中打开文件并使用对我的ifstream和所有数组的引用。
数组不能是全局的(这样可以解决问题),必须传递给函数。数组的大小被设置为20,但是所使用的元素数量是未知的。我正在把项目,因为我有它的工作现在,但我想洞察到这将如何可能为未来的项目。
如果我有点困惑,我想帮助的问题总结是如何使用函数将文件数据读取到多个数组中并在函数中打开文件。我在Win7上使用VS2012。
下面是main和prototype正常工作的代码片段:
int loadArrays(int &, int &, int &, int &, int &, ifstream &);
int main()
{
const int SIZE = 20;
int playerNum[SIZE], atBats[SIZE], hits[SIZE], runs[SIZE], rbis[SIZE], batAvg[SIZE], numberOfPlayers;
ifstream statsIn;
statsIn.open("Batting Stats.txt");
if (statsIn.fail())
// this will alert user if there is a problem opening the file
cout << "Error opening the filen";
// load arrays from file
for(int count = 0; count < SIZE; count++)
{
numberOfPlayers = loadArrays(playerNum[count], atBats[count], hits[count], runs[count], rbis[count], statsIn);
// stops inputing to arrays once no more data is in the file, loop iterates one extra time to test for garbage input.
if(playerNum[count] < 1)
break;
}
statsIn.close();
调用的函数正常工作:
/*This function will read the data from the file and store it into the proper arrays, as
well as collect the number of players based on the total number of calls to this function.
Function will be called one extra time to test for garbage input into arrays. Return
value is the number of players plus one due to test, negate issue by decrementing
return value by one.*/
int loadArrays(int &player, int &bat, int &hit, int &run, int &rbi, ifstream &stats)
{
static int count = 0;
stats >> player;
stats >> bat;
stats >> hit;
stats >> run;
stats >> rbi;
count++;
return count - 1;
}
当我将代码移动到如下所示时,我遇到了无法修改所有元素的问题,因此在第一个元素之后得到垃圾。我将计数设置为参考,认为如果它在主程序中被修改,那么传递给函数的元素将自动更新,因为它们正在使用计数器保持并行。我认为这就是问题所在,但我找不到任何证据表明这是否是一条死胡同。
如果我使用循环逐个传递数组元素,那么每次循环迭代时,我将关闭文件并重新打开它,重置光标位置并引起其他头痛。此外,随着文件在函数中打开,我不会有返回值高一个的问题,但这并不影响函数的操作。
主和原型:
int loadArrays(int &, int &, int &, int &, int &, int &);
int main()
{
const int SIZE = 20;
int playerNum[SIZE], atBats[SIZE], hits[SIZE], runs[SIZE], rbis[SIZE], batAvg[SIZE], numberOfPlayers, count = 0;
// load arrays from file
numberOfPlayers = loadArrays(playerNum[count], atBats[count], hits[count], runs[count], rbis[count], count);
和被调用的函数:
int loadArrays(int &player, int &bat, int &hit, int &run, int &rbi, int &count)
{
ifstream statsIn;
statsIn.open("Batting Stats.txt");
if (statsIn.fail())
// this will alert user if there is a problem opening the file
cout << "Error opening the filen";
while(statsIn >> player)
{
statsIn >> bat;
statsIn >> hit;
statsIn >> run;
statsIn >> rbi;
count++;
}
statsIn.close();
return count;
}
在第一个代码片段中,您使用外部循环遍历元素并将它们(通过引用)传递给函数。另一方面,在第二个代码片段中,在函数内部使用循环,但传递的是相同的元素—而不是整个数组,因此您只访问每个数组的单个元素。解决方案(伪代码):
int loadArrays(int [], int [], int [], int [], int [], int);
int main()
{
const int SIZE = 20;
int playerNum[SIZE], atBats[SIZE], hits[SIZE], runs[SIZE], rbis[SIZE], batAvg[SIZE], numberOfPlayers, count = 0;
// load arrays from file
numberOfPlayers = loadArrays(playerNum, atBats, hits, runs, rbis, count);
...
和函数本身:
int loadArrays(int player[], int bat[], int hit[], int run[], int rbi[], int count)
{
ifstream statsIn;
statsIn.open("Batting Stats.txt");
if (statsIn.fail())
// this will alert user if there is a problem opening the file
cout << "Error opening the filen";
while(statsIn >> player)
{
statsIn >> bat[count];
statsIn >> hit[count];
statsIn >> run[count];
statsIn >> rbi[count];
count++;
}
statsIn.close();
return count;
}