我试图创建一个数组,将数组写入文件而不是显示它。它似乎工作,但我只得到输出的一部分(前3个元素)或我得到超过边界的值。
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int arr[20];
int i;
for (i = 0; i < 5; i++)
{
cout << "Enter the value to the array: " << endl;
cin >> arr[i];
}
ofstream fl("numbers.txt");
if (!fl)
{
cout << "file could not be open for writing ! " <<endl;
}
for (i = 0; i < arr[i]; i++)
{
fl<<arr[i]<<endl;
}
fl.close();
ifstream file("numbers.txt");
if(!file)
{
cout << "Error reading from file ! " << endl;
}
while (!file.eof())
{
std::string inp;
getline(file,inp);
cout << inp << endl;
}
file.close();
return 0;
}
答案 0 :(得分:2)
for
循环中的终止条件不正确:
for(i=0;i<arr[i];i++)
如果用户输入以下5 int
s:
1 0 4 5 6
for
循环将在第二个int
终止,0
,1 < 0
(这是i<arr[i]
所等同的)是{{ 1}}。对于输入,代码有可能超出数组的范围:
10 11 12 13 14
false
循环将迭代超出前5个元素并开始处理数组for
中的单元化值,因为它尚未初始化:
arr
如果int arr[20];
中的元素总是大于arr
,则可能导致对数组的超出访问权限。
一个简单的解决方法:
i
其他要点:
始终检查I / O操作的结果,以确保变量包含有效值:
for(i=0;i<5;i++)
if (!(cin >> arr[i]))
{
// Failed to read an int.
break;
}
循环必须将for
s的数量存储到int
中,因此代码的其余部分仅处理用户提供的值。使用具有固定大小的数组和用于指示已填充元素数量的变量的替代方法是使用仅包含有效arr
的{{3}}(并且可以查询其{{ {1}}或使用迭代器迭代。)
int
不正确,因为只有在尝试读取超出文件末尾的读取时,文件结束标志才会设置。立即检查I / O操作的结果:
size()
答案 1 :(得分:1)
试试这个:
//for(i=0;i<arr[i];i++)
for(i=0;i<5;i++)
[EDITED] 我会像这样用0初始化数组:int arr [20] = {0};在这种情况下,您可以使用例如:
while ((arr[i] != 0 || i < sizeof(arr))
答案 2 :(得分:1)
就像hmjd说的那样
for(i=0;i<arr[i];i++)
看起来不对
它看起来应该是这样的
int size;
size=sizeof(your array);
for(i=0;i<size;i++)
答案 3 :(得分:-1)
i<array[i]
这是错误的,因为它与数组的内容进行比较,它不会检查数组的大小。