今天发现了一个关于C++文件操作非常有趣的现象,但不知怎么解释,求解释!

今天发现了一个关于C++文件操作非常有趣的现象,但不知如何解释,求解释!!
#include<iostream>
#include<fstream>
using namespace std;
void main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10},b[10];
fstream file("1.txt",ios::out); //定义一个文件流对象
if(file.fail())
{
cout<<"打开失败!"<<endl;
}
for(int i=0;i<10;i++)
{
file<<a[i]<<" ";
}
file.close();
file.open("1.txt",ios::in);
if(file.fail())
{
cout<<"打开失败!"<<endl;
}
int j=0;
while(!file.eof())
{
file>>b[j];
cout<<b[j]<<" ";
j++;
}
cout<<endl;
file.close();
//for(int k=0;k<22;k++) cout<<b[k]<<"  ";
}
程序运行的结果为什么还多出一个1?于是我越界访问b数组(加上最后一行)时,发现数组b的大小竟然变成了两倍!实在想不通!求高手解释!!!
------解决方案--------------------
在写文件的时候10后面加了个空格

读完10并没有读到文件结尾,即file.eof()返回0

因此输出会多一个,b[10]为越界访问,内容无法预测
------解决方案--------------------
楼主的朋友,你的这个问题我在window下的eclipse下运行了,一开始确实出现您说的问题了,但是我发现你的问题出现在你写文件的时候就是代码中的file << a[i] << " ";你这样做的目的在最后一次的时候多写了一个空格。我将你写的代码进行了修改就是判断如果写的是最后一个数据就不加空格了。这样代码就对了,我把修改后的代码进行了粘贴,您在运行试试,我试过了没有您说的那个多一个10的问题了。
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10},b[10];
fstream file("1.txt",ios::out); //定义一个文件流对象
if(file.fail())
{
cout<<"打开失败!"<<endl;
}
for(int i=0;i<10;i++)
{
if(i==9)
{
file << a[i];
}
else
{
file<<a[i] <<" ";
}
}
file.close();
file.open("1.txt",ios::in);
if(file.fail())
{
cout<<"打开失败!"<<endl;
}
int j=0;
while(!file.eof())
{
file>>b[j];
cout<<b[j]<<" ";
++j;
}
cout<<endl;
file.close();
//for(int k=0;k<22;k++) cout<<b[k]<<"  ";
return 0;
}

------解决方案--------------------
推荐使用WinHex软件查看文件或内存中的原始字节内容。