c++的string类不会用,感觉像鸡肋

蓝鹰 2012-05-30 09:05:49

#define Size 100


string Items[Size];

void AppInit()
{
FILE *ItemsToExecute=fopen("ItemsToExecute.txt","r");
if(ItemsToExecute==NULL)
ItemsToExecute=fopen("ItemsToExecute.txt","w+");
else
return;
/*cout<<"请设置文件列表大小"<<endl;
cin>>Size;*/

cout<<"请输入您想要列入切换列表的服务名称(以回车键隔开,输入‘end’结束录入):"<<endl;
int i=0;
do
{
cin>>Items[i]; //全局变量
if(i==0)
fwrite(Items[i].c_str(),sizeof(Items[i])+1,1,ItemsToExecute);
else
{
fwrite("\n",sizeof("\n"),1,ItemsToExecute);
fwrite(Items[i].c_str(),sizeof(Items[i])+1,1,ItemsToExecute);
}
//测试代码
printf("items %d, size:%d",i,sizeof(Items[i])); // 大小始终为32字节
printf("int size:%d",sizeof(int)); // 大小为4字节
printf("char size:%d",sizeof(char));
i++;
}while(i<Size&&strcmp(Items[i].c_str(),"end")!=0);
fclose(ItemsToExecute);
}




平时用的都是mfc的CString,今天写个自己用的管理系统服务小程序,结果发现标准c++的string 类真难用,写到文件ItemsToExecute.txt中的类容的每一行末尾总有乱码,真心感觉不如CString 好用。求大侠指教

...全文
136 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
蓝鹰 2012-05-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

建议你使用fstream来进行文本的输入输出。
[/Quote]c语言的那一套读写接口用惯了。到现在倒不觉得c++的fstream好在什么地方。
蓝鹰 2012-05-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

关键的错误在这里:
C/C++ code

fwrite(Items[i].c_str(),sizeof(Items[i])+1,1,ItemsToExecute);



sizeof(Items[i])得到的并不是Item[i]这个string的长度,而是Item[i]的数据类型的大小,就像在大多数32bit的系统中,sizeof(int) = 4bytes一样。

所以size……
[/Quote]
恩,多谢指出。不应该犯这种错误的
蓝鹰 2012-05-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

string对象中字符串的长度不能用“sizeof(Items[i])”来求,应该这样调用string的成员函数size来求。
Items[i].size();
[/Quote]
多谢,是我想当然地这样写了,太粗心了
pathuang68 2012-05-30
  • 打赏
  • 举报
回复
关键的错误在这里:

fwrite(Items[i].c_str(),sizeof(Items[i])+1,1,ItemsToExecute);


sizeof(Items[i])得到的并不是Item[i]这个string的长度,而是Item[i]的数据类型的大小,就像在大多数32bit的系统中,sizeof(int) = 4bytes一样。

所以sizeof(Items[i])要么写成strlen(Items[i].c_str()),要么写成Items[i].size()
super_admi 2012-05-30
  • 打赏
  • 举报
回复
建议你使用fstream来进行文本的输入输出。
super_admi 2012-05-30
  • 打赏
  • 举报
回复
从通用性角度来说,std::string要比CString好很多,std::string要比CString强大。

但我觉得也许是STL的设计人员对使用者的估计比较高,因此,一些常用的方法,比如trim等,string都不提供,而需要你自己做一些简单的封装。

如果确认运行环境是Windows,我个人喜欢使用CString,这样在调用一些FOR WIN的东西时,比如COM等等,会方便很多。
liangbch 2012-05-30
  • 打赏
  • 举报
回复
string对象中字符串的长度不能用“sizeof(Items[i])”来求,应该这样调用string的成员函数size来求。
Items[i].size();
ri_aje 2012-05-30
  • 打赏
  • 举报
回复
配合 fstream 使用就会舒服点了吧,强行搭配 fwrite 的话,感觉确实比较鸡肋。
W170532934 2012-05-30
  • 打赏
  • 举报
回复
那是因为你写入的是
fwrite(Items[i].c_str(),sizeof(Items[i])+1,1,ItemsToExecute);
这样写肯定是不对的。items作为一个对象,里面肯定有其它的数据的,你写入文件后乱码就对了,不乱码才不对呢。你需要写入的是字符串,那你就获得items[i]的长度不就可以了么??

64,637

社区成员

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

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