包含以下内容的ini文件: 地址= “localhost” 的 用户名=“根” 密码=“你的密码” 数据库= “yourdatabasename”
我需要在ifstream中找到两个“”之间的单词,并将其放入char中。
有办法吗?
答案 0 :(得分:0)
如果每对夫妇之间有换行符,您可以执行以下操作。
std::string line; //string holding the result
char charString[256]; // C-string
while(getline(fs,line)){ //while there are lines, loop, fs is your ifstream
for(int i =0; i< line.length(); i++) {
if(line[i] != '"') continue; //seach until the first " is found
int index = 0;
for(int j= i+1; line[j] != '"'; j++) {
charString[index++] = line[j];
}
charString[index] = '\0'; //c-string, must be null terminated
//do something with the result
std::cout << "Result : " << charString << std::endl;
break; // exit the for loop, next string
}
}
答案 1 :(得分:0)
我会按如下方式处理:
std::istream& operator>>( std::istream &, NameValuePair & );
然后您可以执行以下操作:
ifstream inifile( fileName );
NameValuePair myPair;
while( ifstream >> myPair )
{
myConfigMap.insert( myPair.asStdPair() );
}
如果您的ini文件包含每个都包含命名值对的部分,那么您需要读取到部分结尾,这样您的逻辑就不会使用流故障,而是使用某种带状态的抽象工厂机。 (你读了一些东西,然后确定它是什么,从而决定你的状态)。
至于实现读入你的名字 - 值对的流,可以用getline完成,使用引号作为终结符。
std::istream& operator>>( std::istream& is, NameValuePair & nvPair )
{
std::string line;
if( std::getline( is, line, '\"' ) )
{
// we have token up to first quote. Strip off the = at the end plus any whitespace before it
std::string name = parseKey( line );
if( std::getline( is, line, '\"' ) ) // read to the next quote.
{
// no need to parse line it will already be value unless you allow escape sequences
nvPair.name = name;
nvPair.value = line;
}
}
return is;
}
请注意,在完全解析令牌之前,我没有写入nvPair.name。如果流式传输失败,我们不想部分写入。
如果getline失败,流将处于失败状态。这将在文件末尾自然发生。如果由于这个原因失败,我们不想抛出异常,因为这是处理文件结束的错误方法。如果名称和值之间失败,或者名称没有尾随符号(但不是空),则可以抛出,因为这不是自然发生的。
请注意,这允许引号之间的空格甚至换行符。它们之间的任何内容都是读取而不是另一个引号。您必须使用转义序列来允许那些(并解析值)。
如果您使用\“作为转义序列,那么当您获得值时,如果它以\结尾(以及将其更改为引号),则必须”循环“,并将它们连接在一起。