C++ 运行文件以填充地图并在空白处拆分
所以我有一个项目,我不希望任何人为我做硬件,但我现在正在学习3个数据结构中的第一个,这样我就可以开始我的项目,在那里我需要通过运行一些文件来填充一些映射,我的示例文件是简单地设置的,我需要提取一个长键作为映射中的字符串值,像这样:C++ 运行文件以填充地图并在空白处拆分,c++,getline,C++,Getline,所以我有一个项目,我不希望任何人为我做硬件,但我现在正在学习3个数据结构中的第一个,这样我就可以开始我的项目,在那里我需要通过运行一些文件来填充一些映射,我的示例文件是简单地设置的,我需要提取一个长键作为映射中的字符串值,像这样: 0 A 1 B 2 C 我的配对显然是0,这是A的关键,A是本项目的字符串,问题是我的导师也说这是一种可能的格式: 0 W e b 1 1 W e b 2 2 W e b 3 其中0是WEB1的键。我知道我需要在空白处除法,但老实说,我甚至不知道从哪里开始
0 A
1 B
2 C
我的配对显然是0,这是A的关键,A是本项目的字符串,问题是我的导师也说这是一种可能的格式:
0 W e b 1
1 W e b 2
2 W e b 3
其中0是WEB1的键。我知道我需要在空白处除法,但老实说,我甚至不知道从哪里开始,我尝试了几种方法,但在第二种情况下,我只能得到字符串的第一个字符
这就是我最终要讨论的,不要担心整个布尔返回,我知道打开文件和检查文件的整个过程应该在这个函数之外进行,但是我的教授希望所有这些都在这个函数中
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;
long n;
string token;
//read file
while(!index_file.eof())
{
getline(?)
//not sure how to handle the return from getline
}
//file read?
return !index_file.fail();
}
如果你是一个纯C爱好者,你可以使用Strutk函数进行线分裂,但是有一个很好的C++方法来分割文件数据:只要将CIN流重定向到你的文件,它就可以分割任何有效的分隔符-空白、标签、换行符,只需要为自己保留一个行计数器
std::ifstream in(file_name);
std::streambuf *cinbuf = std::cin.rdbuf(); //better save old buf, if needed later
std::cin.rdbuf(in.rdbuf()); //redirect std::cin to file_name
// <something>
std::string line;
while(std::getline(std::cin, line)) //now the input is from the file
{
// do whatever you need with line here,
// just find a way to distinguish key from value
// or some other logic
}
马上。使用whilestd::getlineindex_文件,并在循环体中丢失getline。始终检查IO操作是否成功;永远不要以为他们没有失败。