文件流的困惑

蜥蜴枪王 2010-12-23 11:07:37
大家好,今天在写一个很简单的文件流读取和写入的问题的时候,碰到一个很奇怪的现象.
代码如下(PS:代码是C++ primer第三版的电子书上的源码):

#include "stdafx.h"
#include <iostream>
#include <fstream>

using namespace std;
int main()
{
fstream inOut( "123.txt", ios_base::in|ios_base::app );
int cnt=0;
char ch;
inOut.seekg(0);
while ( inOut.get( ch ) )
{
cout.put( ch );
cnt++;
if ( ch == '\n' )
{
// 标记当前位置
ios::pos_type mark = inOut.tellg();
inOut << cnt << ' ';
inOut.seekg( mark ); // 恢复位置
}
}
inOut.clear();
inOut << cnt << endl;
cout << "[ " << cnt << " ]\n";
return 0;
}

我在123.txt上的初始内容为:
abcd
efg
hi
j
按照代码的意思,运行后期待得到的结果应该是:
abcd
efg
hi
j
5 9 12 14
可是运行程序后,在while循环中的向文件写入cnt的数值的语句并没有体现,即运行程序后在控制台的输出是:
abcd
efg
hi // j没有读出来[12]

文件123.txt中的内容变为:
abcd
efg
hi
j
12

我的问题是这样的:
1. 因为要对文件读取和写入,为什么声明inOut的时候,打开模式不是ios-base::in|ios_base::app|ios_base::out
2. 为什么上面这个程序执行以后,不能把最后一个j都出来?
3. 为什么在while循环中的写入文件的语句没有效果?
就是这样,有点长....谢谢大家了...
...全文
87 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
蜥蜴枪王 2010-12-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 aeolus_boy 的回复:]
太正常不过了,可能是primer第三版太老了。primer第三版出来的时候stl标准都好像没完善!
[/Quote]

嗯,我现在也发现这个问题了,而且,我用的是VS2008好像对C++的标准支持的还不是很够,现在我重新改了下代码,可以正常了.

#include "stdafx.h"
#include <iostream>
#include <fstream>

using namespace std;
int main()
{
fstream inOut( "123.txt", ios_base::in|ios_base::app );// 以app方式打开,已开 始文件流指针指向文件末尾
int cnt=0;
char ch;
inOut.seekg(0); // 把文件流指针指向文件开始的地方
while ( inOut.get( ch ) )
{
cout.put( ch );
cnt++;
if ( ch == '\n' )
{
// 标记当前位置
ios::pos_type mark = inOut.tellg();
inOut.seekg(ios::end); // 把文件流指针指向文件末尾
inOut << cnt << ' ';
inOut.seekg( mark ); // 恢复位置
}
}
inOut.clear();
inOut << cnt << endl;
cout << "[ " << cnt << " ]\n";
return 0;
}


主要是在while函数里自己手动把文件流指针移动到文件末尾,那个app模式本身也就包含了ios::out了,所以可以写入.
http://www.cplusplus.com/src/里对app模式的解释如下:
(append) Set the stream's position indicator to the end of the stream before each output operation
我的理解是,每一次在写入文件之前,都把文件流指针移动到文件的末尾.
但是不知道是不是支持不够的原因,在这个程序中我是每一次都手动调用
inOut.seekg(ios::end);
的,
谢谢上面几位的热心,感激... 现在可以结帖了.
科技完美生活 2010-12-23
  • 打赏
  • 举报
回复
我运行你的程序就不进while啊
aeolus_boy 2010-12-23
  • 打赏
  • 举报
回复
太正常不过了,可能是primer第三版太老了。primer第三版出来的时候stl标准都好像没完善!

64,652

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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