strtok()函数问题。

xiangjiantui 2011-06-08 06:08:35

char tok[]="|";
char name[256]={0},artist_name[256]={0},time[10]={0},Album_name[256]={0},genre[256]={0},r[1024]={0};
char buffer[2048];
ifstream instream;
instream.open("song.dat");
while(!instream.eof())
{
instream.getline(buffer,2048);
strcpy(name,strtok(buffer,tok));
strcpy(buffer,strtok(NULL,""));
strcpy(artist_name,strtok(buffer,tok));
strcpy(buffer,strtok(NULL,""));
strcpy(time,strtok(buffer,tok));
strcpy(buffer,strtok(NULL,""));
strcpy(Album_name,strtok(buffer,tok));
strcpy(buffer,strtok(NULL,""));
strcpy(genre,strtok(buffer,tok));
//try{
strcpy(buffer,strtok(NULL,""));
strcpy(r,strtok(buffer,tok));
//}catch(){}
Song_Node* tmp=new Song_Node(name,artist_name,time,Album_name,genre,r);
if (myhead.get_Song_head()==NULL)
{
myhead.set_Songhead(tmp);
myhead.set_Songcur(tmp);
}
else{
myhead.get_Song_cur()->set_pNext(tmp);
myhead.set_Songcur(tmp);
}
}

上面是我C++项目一部分代码
下面是song.dat文件
I Wannna Go|Britney Spears|3:30|Fememe Fatele|pop|
Joy&pain(Feat.김준)|DJ DOC|3:10|강력반 ost part.3|드라마ost|
Black&White|G.NA|3:29|Black&White|댄스|2121

问题是最后一项可空,空就会抛出异常这个怎样可以捕捉到?
可以用别的办法么?
...全文
98 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2011-06-08
  • 打赏
  • 举报
回复
最后一行是空行,读到得就是"",你判断一下不就得了。

而且你的读取方式是完全错误的,我估计你就是错在这里:

while(getline(buffer,2048))
或者
getline(buffer,2048); while(!instream.eof()){//先处理buffer;.... //最后再读下一行getline(buffer,2048)}

这是文件读取的一个关键点,C语言就有这个毛病了.

只有先读到最后一个字符的后一个字符,eof才返回true。

而你写的判别式读完最后一个字符之后,就调用eof,自然返回false,而不是你想象中的true.

所以,你的写法始终会导致你最后操作了一个文件结束符,出现异常。

举个例子,文件本身就是空的。

你先while(!file.eof()),它返回false,因为还没读到最后一个字符之后的一个字符,所以它还不知道eof了,你也许认为此刻返回的是true,其实不是。 于是,你进入了循环,然后操作了个不知道什么东西的东西。
ryfdizuo 2011-06-08
  • 打赏
  • 举报
回复
/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
char str[] ="- This, a sample string.";
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,.-");
}
return 0;
}

64,646

社区成员

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

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