请教一下关于【文件操作】的奇怪的现象?

csdaa2010 2014-05-31 06:01:21
今天在做C++文件操作时碰到一个怪事 折腾了半天,快疯了,
搜索了一下,只看到大量转载的 的文章,千篇一律,无奈只好来发帖请教 。

网上有标准答案(和老师给的一样),不要拿来骗分数,我不想当打字员!
我就是想用其他方法实现


/*
要求输入数据后保存,接着读出文件中的所有数据,文件是否存在不确定。
*/

/*方法1:打开失败*/
void x()
{
char s[10];
ofstream ofs("d:\\student.txt",ios::out|ios::trunc);
ifstream ifs("d:\\student.txt", ios::in|ios::ate);
if(ofs.fail()||ifs.fail())
{
cout<<"打开失败"<<endl;
return;
}
ofs<<"Test";
ifs>>s;
cout>>s;
}


/*方法2:每次打开都会清空student.txt内容(如果文件不存在就自动创建),导致数据永远只有刚刚输入的*/
void x()
{
char s[10];
ofstream ofs("d:\\student.txt",ios::out|ios::in|ios::trunc);//为什么此处要 有ios::in
ifstream ifs("d:\\student.txt",ios::out|ios::in|ios::ate); //为什么此处要 有ios::out
if(ofs.fail()||ifs.fail())
{
cout<<"打开失败"<<endl;
return;
}
ofs<<"Test";
ifs>>s;
cout>>s;
}


/*方法3:student.txt必须事先存在,否则无法打开*/
void x()
{
char s[10];
ofstream ofs("d:\\student.txt", ios::in|ios::out|ios::ate);//同上
ifstream ifs("d:\\student.txt",ios::out| ios::in|ios::ate);//同上
if(ofs.fail()||ifs.fail())
{
cout<<"打开失败"<<endl;
return;
}
ofs<<"Test";
ifs>>s;
cout>>s;
}

...全文
443 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
baichi4141 2014-06-09
  • 打赏
  • 举报
回复
引用 5 楼 csdaa2010 的回复:
[quote=引用 3 楼 ForestDB 的回复:] 这不叫奇怪的现象,在你思考之前,你得先读读参考手册。
刚学C++,书看了好几遍[/quote] 要做菜,你需要分别学会“厨艺”和“各种食材的特性” 你学C++主要是在学其中的语法规则,也就是“厨艺”,除此之外,当你使用一个并非你自己开发的库(例如stream输入输出流)时,你就要看它的参考手册,也就是“这种食材的特性”
shen_wei 2014-06-09
  • 打赏
  • 举报
回复
文件的读写还是使用标准的FILE来操作。。
csdaa2010 2014-06-06
  • 打赏
  • 举报
回复
引用 3 楼 ForestDB 的回复:
这不叫奇怪的现象,在你思考之前,你得先读读参考手册。
刚学C++,书看了好几遍
赵4老师 2014-06-05
  • 打赏
  • 举报
回复
摒弃fstream;使用FILE *!
ForestDB 2014-06-04
  • 打赏
  • 举报
回复
这不叫奇怪的现象,在你思考之前,你得先读读参考手册。
csdaa2010 2014-06-01
  • 打赏
  • 举报
回复
引用 1 楼 redakira 的回复:
ofstream的构造函数: explicit ofstream (const char* filename, ios_base::openmode mode = ios_base::out); 关于第二个参数: mode 描述请求的文件对应的输入输出模式. 这是一个位掩膜(bitmask, 可以通过位与来进行叠加)类型的对象. 它由下列常量成员组成. [下面我给你翻译一下] member constant stands for access in input 打开文件用于输入: 支持输入操作的内部流缓存 out * output 打开文件用于输出: 支持输出操作的内部流缓存. binary binary 使用二进制打开文件而不是文本形式(按比特流而非字节流) ate at end 输出起始于文件尾[定位输出位置] app append 所有输出操作都从已存在的文件的尾部开始. trunc truncate 删除所有文件中本来存在的内容. 其中*表示out永远是默认的模式, 即使你没有显式使用位或|来赋值 同时注意 If the mode has both trunc and app set, the opening operation fails. It also fails if both app and in are set simultaneously. 如果模式同时有trunc和app的话, 打开操作就会失败. 如果app和in同时有, 也会失败. 参考: http://www.cplusplus.com/reference/fstream/ofstream/ofstream/
谢谢
Lancelod_Liu 2014-05-31
  • 打赏
  • 举报
回复
ofstream的构造函数: explicit ofstream (const char* filename, ios_base::openmode mode = ios_base::out); 关于第二个参数: mode 描述请求的文件对应的输入输出模式. 这是一个位掩膜(bitmask, 可以通过位与来进行叠加)类型的对象. 它由下列常量成员组成. [下面我给你翻译一下] member constant stands for access in input 打开文件用于输入: 支持输入操作的内部流缓存 out * output 打开文件用于输出: 支持输出操作的内部流缓存. binary binary 使用二进制打开文件而不是文本形式(按比特流而非字节流) ate at end 输出起始于文件尾[定位输出位置] app append 所有输出操作都从已存在的文件的尾部开始. trunc truncate 删除所有文件中本来存在的内容. 其中*表示out永远是默认的模式, 即使你没有显式使用位或|来赋值 同时注意 If the mode has both trunc and app set, the opening operation fails. It also fails if both app and in are set simultaneously. 如果模式同时有trunc和app的话, 打开操作就会失败. 如果app和in同时有, 也会失败. 参考: http://www.cplusplus.com/reference/fstream/ofstream/ofstream/

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧