我是编程的新手,我正在尝试将数组传递给函数并将所有元素添加到一起并返回总和。问题是我得到了总和的垃圾值。我研究过如何将数组传递给函数,我不知道我是否应该使用指针来传递数组。无论如何我对指针并不擅长。
这是我的代码
#include <cmath>
#include <cstdlib>
using namespace std;
float mean(int);
int sum(int ARRZO[5]);
int total;
int main()
{
int ARRZ[5];
char *inname = "example.txt";
ifstream infile(inname);
if (!infile) {
cout << "There was a problem opening file " << inname << " for reading." << endl;
return 0;
}
cout << "Opened " << inname << " for reading." << endl;
for(int i=0; i<11; i++)
{
while (infile >> ARRZ[i])
{
cout << "Value from file is " << ARRZ[i] << endl;
}
}
total=sum(ARRZ);
cout<<"the sum of the elements in the array is"<<total<<endl;
system("PAUSE");
return 0;
}
int sum(int ARRZO[])
{
int sumz=0;
for (int i=0; i<5; i++)
{
sumz+=ARRZO[i];
cout<<ARRZO[i];
}
cout<<sumz<<endl;
return sumz;
}
答案 0 :(得分:3)
由于内部循环,您实际上正在读取ARRZ[0]
中文件中的所有值。当你到达i=1
时,你就在文件的末尾,而不是阅读任何内容。
删除一个循环,并在成功读取值后递增i
。
答案 1 :(得分:1)
我不确定你认为这对嵌套循环应该做什么:
for(int i=0; i<11; i++)
{
while (infile >> ARRZ[i])
{
cout << "Value from file is " << ARRZ[i] << endl;
}
}
但是(正如@aliexisdm指出的那样)内部循环读取文件的整个内容。他没有(至少直接)指出的是你正在将这些值中的每一个读入数组的第一个元素。然后你回到外部循环,递增i
,然后尝试再次读取文件 - 但是由于已经设置了流failbit
,所以后续的所有读取尝试都会失败
之后,你将数组中的5个项目相加,但由于你没有读取其中的4个项目(并且从未初始化其内容),你最终会得到你从文件中读取的最后一项+ 4垃圾价值,结果还有更多的垃圾(好吧,通常无论如何 - 你真的有未定义的行为,所以程序可能会崩溃并烧毁,但对于大多数当前的计算机,你只会得到一些无意义的数字。)
但是,我会建议更改程序,而不仅仅是删除一个循环并在循环中递增。相反,我会删除所有(显式)循环,并尝试真正使用标准库提供的内容。您可以一下子从文件中读取数字:
std::ifstream infile(inname);
std::vector<int> ARRZ ((std::istream_iterator<int>(infile)),
std::istream_iterator<int>());
然后你可以用std::accumulate
:
int sum = std::accumulate(ARRZ.begin(), ARRZ.end(), 0);
最后,您可以打印出结果:
cout << "The sum of the elements in the array is: " << sum << "\n";
但是,由于您只读取文件中的值以将它们添加到一起,因此您根本不需要存储它们。您可以将它们一起添加并打印出结果:
cout << "The sum of the elements in the file is: "
<< std::accumulate(std::istream_iterator<int>(infile),
std::istream_iterator<int>(), 0);
整个工作减少到一步......