std::getline 未产生正确的输出 (C++)

std::getline not producing correct output (c++)

本文关键字:输出 C++ getline std      更新时间:2023-10-16

我正在用 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的文档并注意第一次重载。

您需要稍微更改处理文件内容的策略。

  1. 逐行读取文件的内容。
  2. 根据需要处理每行。

下面是函数的更新版本。

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;
}
}
}
}