我正在用C ++做作业,我可以使用一些帮助。我不明白为什么以下代码无法按我的意愿工作。我要创建的函数的目的是加载文件并将其解析为映射的键和值,同时跳过空白行和第一个字符为hastag的行。我正在读取的文件如下。
问题是我的nextToken
变量没有由'='
字符定界。我的意思是,当我cout nextToken
时,它不等于'='
字符之前的字符串。例如,数据文件的前两行是
# Sample configuration/initialization file
DetailedLog=1
我认为我拥有的代码应跳过所有以#标签开头的行(但仅跳过第一行),并且
nextToken
等于DetailedLog
(而不是DetailedLog=1
或等于)。在我的输出中,一些带有#标签的行被跳过,而有些则没有,并且我不明白
1
从哪里打印,因为我拥有的cout
语句应该先打印cout
然后"nextToken: "
,但是它正在打印nextToken
,然后是nextToken
,然后是数据文件中"nextToken: "
字符之后的内容。这是我的代码:
bool loadFile (string filename){
ifstream forIceCream(filename);
string nextToken;
if (forIceCream.is_open()){
while (getline(forIceCream, nextToken, '=')) {
if (nextToken.empty() || nextToken[0] == '#') {
continue;
}
cout << "nextToken: " << nextToken << endl;
}
}
}
从以下位置读取数据文件:
# Sample configuration/initialization file
DetailedLog=1
RunStatus=1
StatusPort=6090
StatusRefresh=10
Archive=1
LogFile=/tmp/logfile.txt
Version=0.1
ServerName=Unknown
FileServer=0
# IP addresses
PrimaryIP=192.168.0.13
SecondaryIP=192.168.0.10
# Random comment
最佳答案
如果输入文件的前两行是:
# Sample configuration/initialization file
DetailedLog=1
然后,通话
getline(forIceCream, nextToken, '=')
将读取所有内容,直到第一个
=
至nextToken
。在该行的末尾,nextToken
的值将是:# Sample configuration/initialization file
DetailedLog
请参阅
std::getline
的文档,并注意第一个重载。您需要稍微改变处理文件内容的策略。
逐行读取文件的内容。
视需要处理每一行。
这是您功能的更新版本。
bool loadFile (string filename)
{
ifstream forIceCream(filename);
if (forIceCream.is_open())
{
// Read the file line by line.
string line;
while ( getline(forIceCream, line) )
{
// Discard empty lines and lines starting with #.
if (line.empty() || line[0] == '#')
{
continue;
}
// Now process the line using a istringstream.
std::istringstream str(line);
string nextToken;
if ( getline(str, nextToken, '=') )
{
cout << "nextToken: " << nextToken << endl;
}
}
}
}