假如用fstream打开一个空文件(0字节),再使用fs.eof()会返回真值吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了假如用fstream打开一个空文件(0字节),再使用fs.eof()会返回真值吗相关的知识,希望对你有一定的参考价值。

如题,

就是这时,还可以进行一次读入吗?
具体程序如下::#include<iostream>
#include<fstream>
#include<string>
#include<cstdlib>
#include<conio.h>
using namespace std;
class goods

int amount;
string userName;

public:
goods()
goods(int i):amount(0)

cout<<"由于你是第一次使用,请输入你的名字"<<endl;
cin>>userName;

goods(fstream&);
int choose();
goods add();
goods reduce();
void display() const;
void restore(fstream&);
;
goods::goods(fstream& fs)


fs>>amount;
if(fs.eof())amount=0;userName="默认管理员";return;
fs>>userName;


void goods::restore(fstream& fs)

if(!fs)


fs.open("goods.txt",fstream::out);
fs<<amount<<"\n"<<userName<<"\n";
fs.close();

else

fs.seekp(0,fstream::beg);
fs<<amount<<'\n'<<userName<<'\n';




int goods::choose()

string choose;
cout<<"请进行操作选择,1---进货,2---出货,3---输出数据,4---退出程序"<<endl;
cin>>choose;
cin.clear();
if(choose=="1")return 1;
else if(choose=="2") return 2;
else if(choose=="3") return 3;
else return 4;


goods goods::add()

system("cls");
string plus;
cout<<"请输入进货的数量"<<endl;
cin>>plus;
cin.clear();
amount+=atoi(plus.c_str());

return *this;

goods goods::reduce()

system("cls");
string minus;
cout<<"请输入出货的数量"<<endl;
cin>>minus;
cin.clear();
amount-=atoi(minus.c_str());
return *this;



void goods::display() const

cout<<"当前货物数量是:"<<amount<<endl<<"管理者是:"<<userName<<endl;


int main()

goods mygoods;
fstream fs("goods.txt");
if(!fs)
mygoods=goods(1);
else mygoods=goods(fs);
while(1)
int myChoose=mygoods.choose();
if(myChoose==1)
mygoods.add().display();
else if(myChoose==2)
mygoods.reduce().display();
else if(myChoose==3)
mygoods.display();
else
break;

mygoods.restore(fs);

return 0;


问题是,第一次建立数据后想在退出时,存储数据,经调试,无法正常存储,
每次建立的文件都是0字节,
对fstream不熟悉,
对文件流不熟悉...

后面打开程序加载文件时,就会出现不正常的数据

参考技术A 即使新建的一个空文件 在开头也会有一个字节,存了一个ASCII码为-1的数据。可以读出来 读了就会到FEOF了 参考技术B 对新打开的空文件,流标记是这样设定的:
输入流 ifstream 在文件打开时会自动检测是否可读,如果是空文件则检测失败,自动设定 failbit 标记,但不会设立 eofbit 标记
输出流 ofstream 在文件打开时不检测读操作,因此 failbit 和 eofbit 都不会设定
输入输出流 fstream 与 ifstream 一样也会检测读,因此对空文件来说 failbit 也是 true,但 eofbit 仍是 false
eofbit 只有当读位置处于文件结尾且再次手动读取数据时才会被设定。

当使用 if(fs) 或 if(!fs) 的表达式时,实际上判断了 fstream 的三个错误标记位:failbit eofbit badbit ,只有当三个都未设定时 if(fs) 才返回 true
因此对空文件的 ifstream 或 fstream 可在文件打开后即由 if(fs) 来判断是否可读。

当文件流被设立 ios::failbit 或 ios::eofbit 标记后,后面如果要再次正常使用这个流对象的话,这个标记必须要手动清除掉,不然所有读写动作都变为空操作。
在判断 eof() 或 if(fs) 或 if(!fs) 后用 fs.clear() 清除错误标记,然后 seekp() 到文件开头即可。本回答被提问者采纳

C++(八):fstream读写操作

参考技术A

头文件fstream定义了三个类型来支持文件IO操作。

要读写一个文件,可以定义一个文件流对象,并将对象与文件关联起来。每个文件流类都定义了一个名为open的成员函数,可以完成一些系统相关的操作,来定位给定的文件,并视情况打开位读或写模式。

创建文件流对象时,可以提供文件名,此时会自动调用open

用fstream代替iostream& :在要求使用基类型对象的地方,可以使用继承类型的对象来代替。

成员函数open和close:如果定义了一个空文件流对象,可以调用open来将它与文件关联起来,如果调用open失败,failbit会被置位。

一旦文件流与文件关联起来,它会一直保存,此时别的流无法再与该文件绑定,所以有时需要关闭已关联的文件。

自动构造与析构: 用ifstream类型构造一个对象,如果该对象是一个循环中的局部变量,在每个循环中都要创建和销毁一次。当一个对象离开其作用域时,与之关联的文件会自动关闭,即自动调用close。

每个流都有一个关联的 文件模式 ,用来指出如何使用文件。

指定文件时有如下限制:

以out模式打开文件会丢弃已有数据: 默认情况下打开ofstream时,文件的内容会被丢弃。 阻止一个ofstream清空给定文件内容的方法时同时指定app模式

每次调用open时都会确定文件模式: 对于一个给定流,每当打开文件时,都可以改变其文件格式。

以上是关于假如用fstream打开一个空文件(0字节),再使用fs.eof()会返回真值吗的主要内容,如果未能解决你的问题,请参考以下文章

保存系统不打开 fstream 文件?

c++文件流fstream中的函数

怎样用fstream对二进制文件进行内容修改和删除?

C++ 我用的fstream打开,结果读完后却写不进去了,无法输入新的成绩

C++文件流的C++ 中 *fstream 操作

fstream指针