游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4680|回复: 7

fstream真的能对文件既读又写吗?《C++ Primer第三版》上的

[复制链接]

15

主题

129

帖子

129

积分

注册会员

Rank: 2

积分
129
QQ
发表于 2006-11-26 23:45:00 | 显示全部楼层 |阅读模式
《C++ Primer第三版》上的例子,到我手中却怎么也得不到正确的结果。和作者说的千差万别。我来指出与作者的不同的结果,希望大家帮忙指出我的错误(真的是我错了吗?)
void main()
{
        fstream inOut( "tt.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";
}
1. ios_base::app 也无法添加数据 ios_base:ut也无法添加数据(都是在文件有数据的情况下)
2. inOut.seekg(0);无用,说app模式会定位在文件结尾,可不是这样的。仍然定位在文件开始
3. inOut << cnt ;执行后无结果就如同没有执行一样

由此得到一个稀奇古怪的结论,ifstream 用来读入文件,ofstream用来在文件的末尾处进行写入,那谁来修改文件呢,现在是无法修改,只能清除文件然后重新写入。真是这样吗?

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2006-11-29 10:54:00 | 显示全部楼层

Re:fstream真的能对文件既读又写吗?《C++ Primer第三版》上

我想说的是,std c++中的fstream和iostream一样都是很尴尬的东西,使用上没有FILE的系列函数方便,效率上也远不及后者,所以沦为学术研讨的东西,实际项目中很少用fstream来做file io。

fstream内部是用FILE在实现,而FILE在windows平台上是用FileOpen,所以我的推荐是使用FILE来做足矣,stream只是“看上去”比较cool而已的东西。

你说的123问题并不存在,而关于修改的问题在于,文件是不会“自增长”的。比较底层的东西,就不要企图用比较高层的思想去应用。或者你可以在一个std::string中add/insert/append之后再把它写入文件,可能就是你想要的吧,不过这样做又有什么意义呢。

15

主题

129

帖子

129

积分

注册会员

Rank: 2

积分
129
QQ
 楼主| 发表于 2006-11-29 13:40:00 | 显示全部楼层

Re:fstream真的能对文件既读又写吗?《C++ Primer第三版》上

呵呵,感谢千里马肝兄。只是由于知识的面太窄,在处理问题上,只能也只会使用C++的这种法子,难怪我问几个做程序的朋友,他们一概都使用的是FILE,而对C++的模式却涉足不深。

8

主题

284

帖子

296

积分

中级会员

Rank: 3Rank: 3

积分
296
QQ
发表于 2006-12-3 00:17:00 | 显示全部楼层

Re:fstream真的能对文件既读又写吗?《C++ Primer第三版》上

fstream继承自stream所以在数据流操作方法还是有一定的优势的。

当然,怎么方便怎么做。

在WINDOWS平台上也有相关的文件操作函数。

15

主题

368

帖子

406

积分

中级会员

Rank: 3Rank: 3

积分
406
发表于 2006-12-7 02:52:00 | 显示全部楼层

Re:fstream真的能对文件既读又写吗?《C++ Primer第三版》上

C++程序员应该尽量用fstream来操作文件。事实上fopen能胜任的它也都能胜任。而且方便易用。不用判断空指针,不用怕忘了关闭。有什么不好的?我在实际项目当中都是使用fstream。(事实上在项目当中使用API函数并不方便,如果要方便,必须封装。但是当你封装完API函数之后会发现又沦为一个类似fstream的东西,而且功能远远不如fstream来得强大。除非很有必要,尽量不要直接用API函数)


PS:VC2005中它对ANSIC串的中文路径支持的BUG很是令人头疼。

15

主题

129

帖子

129

积分

注册会员

Rank: 2

积分
129
QQ
 楼主| 发表于 2006-12-28 15:27:00 | 显示全部楼层

Re:fstream真的能对文件既读又写吗?《C++ Primer第三版》上

不过 楼上几位能帮忙看看第一楼的问题吗?其实倒不是想讨论哪种方法重要,我向来认为方法是为了解决问题存在的,能解决就是好方法

15

主题

368

帖子

406

积分

中级会员

Rank: 3Rank: 3

积分
406
发表于 2007-1-8 01:19:00 | 显示全部楼层

Re:fstream真的能对文件既读又写吗?《C++ Primer第三版》上

还是帮楼主解决一下实际问题好了:
我一般是直接用fstream,没有分开用ifstream和ofstream(因为大多数情况下我又要读又要写的,图个方便)

文件不存在时用这种方式创建
file.open(_tUNICODECHAR(strPath), std::ios::app);

创建后读写用这种方式(这种方式打开不存在的文件会失败)
file.open(_tUNICODECHAR(strPath), std::ios::in | std::ios:ut | std::ios::binary);


基本上能满足所有需要了。不要把创建和打开读写放在一起。

15

主题

129

帖子

129

积分

注册会员

Rank: 2

积分
129
QQ
 楼主| 发表于 2007-1-8 21:16:00 | 显示全部楼层

Re:fstream真的能对文件既读又写吗?《C++ Primer第三版》上

多谢回复 还是让这个帖沉到太平洋海底吧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 05:42

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表