C++文件操作之eof函数问题


关于eof函数


      fstream / ifstream / ofstream 类中的 成员函数eof()用来检测是否到达文件尾,如果到达文件尾返回非0值,否则返回0。原型是int eof();


      在使用这个函数时,如执行下面代码:

#include <iostream>
#include <fstream>
using namespace std;

int main(){
	ofstream fileOut;
	ifstream fileIn;

	fileOut.open("testFile");
	for(int i = 0; i < 5; i++)
		fileOut<<i;
	fileOut.close();

	fileIn.open("testFile");
	while(!fileIn.eof()){
		int i;
		fileIn>>i;
		cout<<i<<"\t";
	}
	cout<<endl;
	fileIn.close();	

}

    如上代码输出的是   0   1   2   3   4


   而对于下面代码

#include <iostream>
#include <fstream>
using namespace std;

int main(){
	ofstream fileOut;
	ifstream fileIn;

	fileOut.open("testFile");
	for(int i = 0; i < 5; i++)
		fileOut.write((char*)(&i),sizeof(i));
	fileOut.close();

	fileIn.open("testFile");
	while(!fileIn.eof()){
		int i;
		fileIn.read((char*)(&i), sizeof(i));
		cout<<i<<"\t";
	}
	cout<<endl;
	fileIn.close();
}

     输出的结果则是  0    1    2    3    4    4

    

     从网上查阅关于eof函数的一些说法中,有如下这种说法:

    eof()返回true的条件是“读到文件结束符”,而不是文件内容的最后一个字符。“文件结束符”不是指文件最后的字符,而是文件最后的字符的下一位。

   

     对于上面一段代码,i是以文本形式输入文件也是以文本形式读取文件,每一个int在输进去文件是是以char或是char[ ]形式输入的,读入时则是以char形式读入,文件以迭代方式读入char并输入屏幕显示,其实到最后文件也有读入最后所谓的“文件结束符”,“文件结束符”是一个不可显示字符,因为“文件结束符”实际上的值为-1。 我们知道在ASCII代码值的范围是0~255,不可能出现-1。。

    而对于下一段代码,i是以二进制形式输入文件的也是以二进制形式读取文件的,每一个int在输入文件时是以int形式输入,在读取时也是以int形式读入。知道int所占字节是4,而char所占字节是1。当读完文件中所有的int时,读到最后的“文件结束符”时,只剩下1字节,和

fileIn.read((char*)(&i), sizeof(i));

    中的sizeof(i)不符,这时编译器会重复上一个sizeof(i)的数据并输出。所以最后输出会重复最后一个int。




已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页