使用带有迭代器的字符串函数erase
时遇到问题。
下面的函数获取输入文件和.ini
文件的名称,并创建输出文件的路径。路径定义为
dir + in_file + def_name + ini_file + ".txt"
我正在使用erase
来删除输入文件名的扩展名。
void Output::vDefault(string in, string ini)
{
//save names
strIn=in;
strIni=ini;
//get working dir
char mydirectory[MAX_PATH] = {""};
GetCurrentDirectory(MAX_PATH,mydirectory);
//erase extensions
strIn.erase(strIn.find_last_of('.'), strIn.end()); // error
strIni.erase(strIni.find_last_of('.'), strIni.end()); // error
//adr starts with folder
strAdr=mydirectory;
//and ends with name
//address=dir+in_file+def_name+ini_file+.txt;
strAdr+=strIn+DEFOUTNAME+strIni+".txt";
}
运行代码会导致以下错误:
error C2664: 'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::erase(unsigned int,unsigned int)' : cannot convert parameter 2 from 'std::_String_iterator<_Elem,_Traits,_Alloc>' to 'unsigned int'
erase
可以将两个迭代器作为第一个和最后一个。你能帮助我吗?我不知道为什么它在我的项目中除了int
之外什么都不接受。
答案 0 :(得分:1)
发生错误是因为擦除签名需要2个size_t或2个迭代器。不是一个组合。 find_last_of返回size_t
http://www.cplusplus.com/reference/string/string/erase/
string& erase ( size_t pos = 0, size_t n = npos );
iterator erase ( iterator position );
iterator erase ( iterator first, iterator last );
http://www.cplusplus.com/reference/string/string/find_last_of/
size_t find_last_of ( const string& str, size_t pos = npos ) const;
size_t find_last_of ( const char* s, size_t pos, size_t n ) const;
size_t find_last_of ( const char* s, size_t pos = npos ) const;
size_t find_last_of ( char c, size_t pos = npos ) const;
解决方案是使用
string& erase ( size_t pos = 0, size_t n = npos );
这是size_t n可选。
从pos位置开始删除n个字符的序列。注意 这两个参数都是可选的:只有一个参数, 函数从位置pos向前删除所有内容,并且没有 参数,该函数删除整个字符串,如成员清除。
strIn.erase(strIn.find_last_of('.'));
strIni.erase(strIni.find_last_of('.'));
答案 1 :(得分:0)
string::find_last_of()
不返回迭代器,因此无法匹配string::erase()
的迭代器重载。
幸运的是,获取位置索引的string::erase()
重载默认为从那里删除到结尾,因此以下内容适合您:
strIn.erase(strIn.find_last_of('.'));
strIni.erase(strIni.find_last_of('.'));
当然,字符串中最好有一个'.'
字符......
答案 2 :(得分:0)
std::find_last_of返回size_t
而不是迭代器。