所以我是C ++的新手,我正在尝试一个看起来像这样的文件:
0 A
1 B
2 C
3 D
4 E
我需要逐行处理这个文件,然后在每一行我需要从行中取两个数字并将它们放在一个地图中,其中数字是一个名称为a的节点的ID# string这样0就是我地图中节点A的关键。
我认为我逐行排队,但即使这样也有点不稳定。
这就是我所拥有的:
bool read_index(map<long, string> &index_map, string file_name)
{
//create a file stream for the file to be read
ifstream index_file(file_name);
//if file doesn't open then return false
if(! index_file.is_open())
return false;
string line;
//read file
while(! index_file.eof())
{
getline(index_file,line);
stringstream ss(line);
while(ss)
{
//process line?
}
}
//file read
return true;
}
答案 0 :(得分:2)
如果字符串中没有空格,那么您可以忽略换行符并只提取标记:
void read_index(std::istream & infile, std::map<long, std::string> & index_map)
{
long n;
std::string token;
while (infile >> n >> token) { index_map[n] = std::move(token); }
}
在调用此函数之前,应单独进行错误检查以打开文件。否则你的功能太多了。
如果您有任意字符串,可能包含空格,则需要使用getline
:
for (std::string line; std::getline(infile, line); )
{
std::istringstream iss(line);
long n;
std::string token;
if (iss >> n >> std::ws && std::getline(iss, token))
{
index_map[n] = std::move(token);
}
else
{
// unparsable input line
}
}
正如您所看到的,基于行的处理的好处是您还可以处理无效行并跳过这些行。第一个纯粹基于令牌的代码一旦无法识别令牌就会一劳永逸地停止。
答案 1 :(得分:0)
您滥用eof()
。尝试更像这样的东西:
bool read_index(map<long, string> &index_map, string file_name)
{
//create a file stream for the file to be read
ifstream index_file(file_name);
//if file doesn't open then return false
if(!index_file)
return false;
string line;
//read file
while(getline(index_file, line))
{
stringstream ss(line);
long n;
std::string token;
if (ss >> n >> token)
{
//process line
index_map[n] = token;
}
else
{
// error do something
}
}
//file read?
return !file.fail();
}