我正在用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;
         }
      }
   }
}

09-11 17:21