我一直收到一条错误,上面写着"没有匹配功能来拨打' strtok'"。我不太擅长编码而且很困惑D:
来自文件I的行的示例' m来自: Wilco Wilco 2009 Nonesuch Records 11 58 Rock
int find_oldest_album(Album **& albums, int num_of_albums){
string line;
ifstream fin;
fin.open("/Users/ms/Desktop/albums.txt");
while (!fin.eof())
{
getline(fin, line, '\n');
char * artist_name;
char artist_name = strtok(line, '\t');
char * title_name;
title_name = strtok(NULL, '\t');
char * release_year;
release_year = strtok(NULL, '\t');
}
fin.close();
}
答案 0 :(得分:1)
strtok
函数可能仅适用于字符数组。它是C标准功能。如果要在使用标题std::string
中声明的标准流类strtok
时使用与std::istringstream
相同的方式解析<sstream>
类型的对象
例如
#include <sstream>
//...
std::string line;
std::getline( fin, line, '\n' );
std::istringstream is( line );
std::string artist_name;
std::getline( is, artist_name, '\t' );
至于你的代码,那么它包含很多错误。
例如在这两个陈述中
char * artist_name;
char artist_name = strtok(line, '\t');
有三个错误。您正在重新声明名称artist_name,函数strtok不能与std::string
类型的对象一起使用,函数strtok
的第二个参数(分隔符)必须指定为字符串,它的类型为{{1 }}
答案 1 :(得分:1)
strtok
是一个损坏的C函数,不应该使用。它需要一个
可写C字符串(不 std::string
),它具有静态状态,即
很容易被腐蚀。
如果您的行有标准分隔符,例如制表符, 编写一个函数可以很容易地将它们分解成字段:
std::vector<std::string>
split( std::string const& line )
{
std::vector<std::string> results;
std::string::const_iterator end = line.end();
std::string::const_iterator current = line.start();
std::string::const_iterator next = std::find( current, end, '\t' );
while ( next != end ) {
results.push_back( std::string( current, next ) );
current = next + 1;
next = std::find( current, end, '\t' );
}
results.push_back( std::string( current, end ) );
return results;
}
更一般地说,对于任何解析问题,只需遍历 字符串,如上所述。
答案 2 :(得分:0)
使用C ++的更好的解决方案由莫斯科的回答中的vlad概述。解决错误&#34;没有匹配的功能来呼叫&#39; strtok&#39;&#34;您需要包含头文件,如下所示:
#include<cstring>