Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从文件中读取数据并插入地图C++;_C++ - Fatal编程技术网

C++ 从文件中读取数据并插入地图C++;

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

当我请求密钥时,它会给出一个巨大的负数(-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> 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::clog
char*color=strtok(nullptr,“”);
const_cast
一个
std::string
是未定义的行为。请改用其他方法。请参阅此问题:是的,但如何将字符串而不是char放入?请检查链接问题的答案。。您的文件只有两个字符串,每个字符串后面都有一个空格?给出错误:变量“std::stringstream ss”具有初始值设定项,但不包含完整类型std::stringstream ss(line);添加
#include
,我还更新了答案。