C++ 从文件中读取数据并插入地图C++;
当我请求密钥时,它会给出一个巨大的负数(-7998482842)或正数(898395893),但它会返回一个字符串 文件格式:C++ 从文件中读取数据并插入地图C++;,c++,C++,当我请求密钥时,它会给出一个巨大的负数(-7998482842)或正数(898395893),但它会返回一个字符串 文件格式: string string hello@gmail.com color1 hello@hotmail.com color2 我认为问题在这里:table[name]=std::string(color) 有人能帮忙吗 class table_data { public: std::map<std::string, std::string> t
string string
hello@gmail.com color1
hello@hotmail.com color2
我认为问题在这里:table[name]=std::string(color)代码>
有人能帮忙吗
class table_data
{
public:
std::map<std::string, std::string> table;
bool read(std::string &fname)
{
std::ifstream ifs (fname, std::ifstream::in);
if(ifs.fail())
{
printf("Cant open\n");
return false;
}
return read(ifs);
}
bool read(std::istream &is)
{
for (std::string line; std::getline(is, line);)
{
char *name = strtok(const_cast<char*>(line.c_str()), " \r");
if(name != nullptr)
{
char *color = strtok(nullptr, " ");
if(color != nullptr)
{
table[name] = std::string(color);
}
else
{
printf("No data %s\n", line.c_str());
return false;
}
}
else
{
printf("No name\n");
return false;
}
}
return true;
}
std::string getcolor(std::string name)
{
std::map<std::string, std::string>::iterator it;
it = table.find(name);
if (it != table.end())
{
return it->second;
}
}
};
类表\u数据
{
公众:
std::映射表;
bool读取(标准::字符串和fname)
{
std::ifstream-ifs(fname,std::ifstream::in);
if(ifs.fail())
{
printf(“无法打开”);
返回false;
}
返回读取(ifs);
}
bool读取(标准::istream&is)
{
for(std::string-line;std::getline(is,line);)
{
char*name=strtok(const_cast(line.c_str()),“\r”);
如果(名称!=nullptr)
{
char*color=strtok(nullptr,“”);
如果(颜色!=nullptr)
{
表[名称]=标准::字符串(颜色);
}
其他的
{
printf(“没有数据%s\n”,第.c_str()行);
返回false;
}
}
其他的
{
printf(“无名称”);
返回false;
}
}
返回true;
}
std::string getcolor(std::string name)
{
std::map::it迭代器;
it=table.find(名称);
if(it!=table.end())
{
返回->秒;
}
}
};
您可以使用std::stringstream
拆分行:
#include <sstream>
//...
bool read(std::istream &is)
{
for (std::string line; std::getline(is, line);)
{
std::string name, color;
std::stringstream ss(line);
if (ss >> name)
{
if(ss >> color)
{
table[name] = color;
}
else
{
printf("No data %s\n", line.c_str());
return false;
}
}
else
{
printf("No name\n");
return false;
}
}
return true;
}
#包括
//...
bool读取(标准::istream&is)
{
for(std::string-line;std::getline(is,line);)
{
std::字符串名称、颜色;
std::stringstream ss(线路);
如果(ss>>名称)
{
如果(ss>>颜色)
{
表[名称]=颜色;
}
其他的
{
printf(“没有数据%s\n”,第.c_str()行);
返回false;
}
}
其他的
{
printf(“无名称”);
返回false;
}
}
返回true;
}
strtok
是遗留的C语言。它可能在新C++代码中被避免,因为它修改正在解析的字符串,并且假定字符串是空的。
使用std::string::find_first_of
和std::string::find_first_not_of
如何
比如:
bool read(std::istream &is)
{
for (std::string line; std::getline(is, line);)
{
auto name_start = line.find_first_not_of(" \r");
if (name_start == std::string::npos)
{
std::clog << "No name\n";
return false;
}
auto name_end = line.find_first_of(" \r", name_start);
if (name_end == std::string::npos)
{
std::clog << "No name\n";
return false;
}
std::string name{line, name_start, name_end - name_start};
std::cout << "name='" << name << "'\n";
auto color_start = line.find_first_not_of(" ", name_end);
if (color_start == std::string::npos)
{
std::clog << "No color\n";
return false;
}
auto color_end = line.find_first_of(" ", color_start);
if (color_end == std::string::npos)
{
std::clog << "No color\n";
return false;
}
std::string color{line, color_start, color_end - color_start};
std::cout << "color='" << color << "'\n";
table[name] = std::move(color);
}
return true;
}
bool读取(std::istream&is)
{
for(std::string-line;std::getline(is,line);)
{
自动名称\u开始=行。首先查找\u而不是(“\r”);
if(name_start==std::string::npos)
{
std::clogchar*color=strtok(nullptr,“”);
?const_cast
一个std::string
是未定义的行为。请改用其他方法。请参阅此问题:是的,但如何将字符串而不是char放入?请检查链接问题的答案。。您的文件只有两个字符串,每个字符串后面都有一个空格?给出错误:变量“std::stringstream ss”具有初始值设定项,但不包含完整类型std::stringstream ss(line);添加#include
,我还更新了答案。