鱼C论坛

 找回密码
 立即注册
查看: 3237|回复: 5

C++字符串比较问题,急求解惑。。

 关闭 [复制链接]
发表于 2011-6-20 16:15:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冰尘。 于 2011-6-21 15:26 编辑

问题是这样的,各位大大请听我细细道来。。

首先,我是用这个AddData函数把数据写入了文件当中。(打开文件等操作在VideoBook的构造函数中完成了)

  1. void VideoBook::AddData()    //增加数据
  2. {
  3. VideoType video;     //影片记录
  4. video.delTag=false;     //正常,未作删除标志
  5. do
  6. {
  7.   cout<<"输入影片名:";
  8.   cin>>video.videoTitle;
  9.   cout<<"输入影片副本数:";
  10.   cin>>video.numOfCopies;
  11.   file.write((char*)&video,sizeof(VideoType));  //写入文件
  12.   cout<<"继续添加吗";
  13. } while (UserSaysYes());   //肯定回答时循环
  14. system("PAUSE");
  15. }
复制代码


然后,我用如下的SearchData函数欲实现查询功能。



  1. void VideoBook::SearchData()                        //查询数据
  2. {
  3.         VideoType video;                                        //影片记录
  4.         char title[1000];                                        //片名
  5.         cout<<"输入要查询影碟的片名:";
  6.         cin>>title;                                                        //输入片名
  7.         file.seekg(0);                                                //定位
  8.         file.read((char*)&video,sizeof(VideoType));                        //读记录
  9.         while (!file.eof())
  10.         {        //文件末结束
  11.                 if(video.videoTitle==title && !video.delTag) break;        //序号相同;记录正常,未作删除标志;查询成功
  12.                 file.read((char*)&video,sizeof(VideoType));                        //读记录
  13.         }
  14.         if (!file.eof())
  15.         {        //查询成功
  16.                 cout<<setw(18)<<video.videoTitle<<setw(18)<<video.numOfCopies<<endl;        //输出记录
  17.         }
  18.         else
  19.         {        //查询失败
  20.                 cout<<"无此片名的记录!"<<endl;
  21.                 file.clear();                                        //清除文件结束标志
  22.         }
  23.         system("PAUSE");
  24. }
复制代码


可是,问题出现了。
查询函数无法完成查询功能,即使输入的片名是添加过的,依然会跳到查询失败的条件分支。
于是我跟踪调试了一番,结果发现在SearchData函数中的while语句前,如果我查询的片名是文件中的第一个,则  video.Title的值和title的值是一样的。但是进入while循环的if条件分支时,还是会直接跳入下次循环,并且最终显示查询失败。也就是说,if(video.videoTitle==title && !video.delTag) break;  这句判断,即使在video.videoTitle和title相等的情况下,还是会被跳过。所以,我认为是不是video.delTag的问题,结果经过跟踪调试,video.delTag读入时,确实也是0值。
于是,我就无解了。。。。
如果我描述的不是很清楚,下面有这个工程的完整代码。希望大大们为我解惑。 谢谢。。。


下面是VideoType结构体的定义:


  1. struct VideoType
  2. {
  3.         bool delTag;                                        //删除标志
  4.         char videoTitle[1000];                        //片名
  5.         int numOfCopies;                                //影碟副本数
  6. };


复制代码



下面是完整工程的下载地址:
http://u.115.com/file/bhaihoa8


望大大们不吝解惑。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-21 07:19:03 | 显示全部楼层
人工置顶,没有人可以解惑吗。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-21 15:01:13 | 显示全部楼层
if(video.videoTitle==title && !video.delTag)         句不能实现字符串比较
更改为:   if(strcmp(video.videoTitle,title)==0 && !video.delTag){:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-21 15:26:02 | 显示全部楼层
:lol  搞定了。。谢谢哈。。。
我也想过这样可能不能比较字符串。但我们教材上却写过类似的代码= =  害人不浅啊啊啊!!!!
十分感谢楼上的伙计哈!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-21 16:19:05 | 显示全部楼层
恭喜冰尘:lol,其实if(video.videoTitle==title && !video.delTag)  这样判断也没有错,只是有个地方你自己忽视了而已:lol还有估计你是在做课程设计吧!大学生忙啊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-21 19:13:31 | 显示全部楼层
哦?能不能请大大祥讲一下哈。。if(video.videoTitle==title && !video.delTag) 怎么得以实现的~?
我下来想了一下,莫非难道也许大概会不会是书上的程序用了运算符重载。但是大概找了一下,好像也没有看到的。。
这个是我们C++期末项目,我才是个大一新生啦。。以后有不懂的还望多多指教哈。。。{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-7 09:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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