关于fstream的若干问题

Jim_King_2000 2005-07-25 11:55:55
一直习惯C语言的文件处理方式。最近尝试STL的fstream,发现若干问题,不能够理解。希望大虾们指点迷津。
首先感觉iostream等库对Unicode的支持不够方便。ANSI对象为cout,Unicode对象为wcout。不像〈tchar.h〉里面,可以用TCHAR、_T和_mbscpy这样的宏,可以随着ANSI或Unicode自行改变函数调用,极大地方便了我们使用。
其次,不明白std::wifstream的构造函数的第一个参数为什么是const char *。wifstream类型可是基于Unicode的啊。我的程序中都是Unicode字符,你要我传什么参数给你?我只好把wchar_t *转换成char *。这样还不如不用Unicode。
再次,如果我们使用binary方式的话,我们可爱的<<操作符仍然只能按照文本的方式来读写。我必须使用非常底层的read函数自行读写binary对象。可问题是Unicode方式下的read函数第一个参数为wchar_t *,无论我第二个参数(长度)是以BYTE为单位还是以WORD为单位,我都得不到正确的结果(ANSI方式下可得到正确的结果)。
最后,没看到介绍fstream的文章/书提到过异常。难道fstream不支持异常?如果真的不支持异常的话,对于像我这样的新手去编写一个健壮的程序是非常困难的。因为我不知道在文件打开以及读写的过程中都会发生哪些错误。我只能求神拜佛盼它千万别出错……
难道我真的要回到面向过程的时代使用_open这样的东西来处理程序?或者改用SDK来写?抑或弃用STL,拣起已成众矢之的的MFC来打开一个小小的文件读出几个字节然后关闭?
C/C++的一个令人心烦地方就是选择太多,令人无所适从。
...全文
455 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
kougu 2005-10-14
  • 打赏
  • 举报
回复
学习
Jim_King_2000 2005-07-29
  • 打赏
  • 举报
回复
算了,结贴吧
K 2005-07-27
  • 打赏
  • 举报
回复
楼上好多单词都拼错啦
Jim_King_2000 2005-07-27
  • 打赏
  • 举报
回复
To steven99ca() :
我也不想用Unicode。可是人在江湖身不由己。我写的是一个读index文件的库。而且需要移植到WinCE中去。WinCE好像都是用Unicode的吧……
我尝试过Unicode下的fstream(wofstream)。本以为无论是ANSI还是Unicode,读数据文件总应该得到相同的结果吧。可是ANSI下和Unicode下的ios::read函数却得不到相同的结果。除此之外还有很多问题。比如STL的异常处理好像也没有Unicode的版本……
看来STL真的还有问题。也许我要用MFC改写我的代码了。
如果steven99ca兄感兴趣的话,给我您的Email,我可以把代码可以发给你看一下(不用看实现,看设计即可),小弟第一次写库,没有经验,请steven99ca兄提出批评意见。
睡在床板下_ 2005-07-27
  • 打赏
  • 举报
回复
奇怪 楼上楼上的,你的英文我居然看的懂啊,
哈哈~~~ 我还挺厉害的啊~~
steven99ca 2005-07-26
  • 打赏
  • 举报
回复
I'm not familiar with Unicode. As I know, unicode support is based on
OS , compiler and C runtime libs. I think you are working on win32.
XP/2000/NT have fully unicode support. 98/95(not Chinese version) have only rudimentary support for unicode.I heard there were some unicode issues with M$ C++ Stream I/O implementation too. I don't have windows box with me.
I think two thing you could try:
1.
Explictly delaring something indicates(#define "_UNICOED" ???) compiler to use unicode function and unicode C lib.
2.
Or you could try use _wfopen get the file handler, then using file handler passing to IO stream.

Good luck.


qfeng_zhao 2005-07-26
  • 打赏
  • 举报
回复
关注。。。
像搂主致敬
Jim_King_2000 2005-07-26
  • 打赏
  • 举报
回复
可不可以写一点简单的代码告诉我应该怎样使用ofstream的异常?谢谢。
Jim_King_2000 2005-07-26
  • 打赏
  • 举报
回复
谢谢楼上。大家可以试试看Unicode方式下的fstream。问题多多。
steven99ca 2005-07-26
  • 打赏
  • 举报
回复
Here you are,
ifstream infile;
infile.exceptions ( ifstream::eofbit | ifstream::failbit | ifstream::badbit );
try {
file.open ("whatever");
while (!file.eof()) file.get();
}
catch (ifstream::failure e) {
cout << "Got Exceptions when opening/reading file";
}

oyljerry 2005-07-26
  • 打赏
  • 举报
回复
问题1:打开一个现有文件,并读取其中内容到一个变量中

#include<stdlib.h>
#include<fstream.h>
void main()
{
ifstream f1("d:write.dat",ios::in|ios::nocreate);//定义输入文件流(输入到内存变中)
                          //若找开失败则下面的!f1为true
if(!f1){//打开失败进行错误处理
 cout<<"d:write.dat file not open!"<<endl;
exit(1);
}
int x;
while(f1>>x)cout<<x<<' ';//f1>>x 是把f1文件中的数据存放到内存变量x中并且显
cout<<endl;
f1.close();//关闭流对像
}  

oyljerry 2005-07-26
  • 打赏
  • 举报
回复
#include <fstream.h>
void main()
{
ifstream in;
in.open(filename1,ios::in|ios::binary);
ofstream out;
out.open(filename2,ios::out|ios::binary);

char a;
while(!in.eof())
{
in.read((char *)&a,1); //从文件读入一字节数据到内存中
out.write((char *)&a,1); //从内存写一字节数据到文件中
}

in.close();
out.close();
}
xzgyb 2005-07-26
  • 打赏
  • 举报
回复
iostream库如果出现错误
会设置内部的状态

ios_base::failbit 如果打开文件失败,或输入格式不正确被设置 用fail()得到
ios_base::eofbit 如果文件结束, 被设置, 用eof()得到
ios_base::badbit 如果io操作出现异常则被设置,用bad()得到,
ios_base::goodbit 正常状态

lujun-cc 2005-07-26
  • 打赏
  • 举报
回复
老兄研究STL还真是细致,学习你的风格!
jsjjms 2005-07-26
  • 打赏
  • 举报
回复
关注
jixingzhong 2005-07-26
  • 打赏
  • 举报
回复
一直都是用的 C ,


现在刚接触C++ 两个月


感觉真的是很不习惯...
steven99ca 2005-07-26
  • 打赏
  • 举报
回复
No kidding , fstream supports exception for sure. You jst have to set up exception bits..

64,642

社区成员

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

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