0

这是我的部分代码:

if(action=="auth")
{


 myfile.open("account.txt");
    while(!myfile.eof())
    {
        getline(myfile,sline);

        vector<string> y = split(sline, ':');
    logincheck = "";
    logincheck = y[0] + ":" + y[3];

    if (sline==actionvalue)
    {
    sendClient = "login done#Successfully Login.";
    break;
    }
    else
    {
    sendClient = "fail login#Invalid username/password.";
    }

    y.clear();
    }
    myfile.close();

}

如果我没有这个

 logincheck = y[0] + ":" + y[3];

该代码不会有任何分段核心转储错误,但是当我添加该行时,它会完全出错。

我的 account.txt 如下:

admin:PeterSmite:hr:password
cktang:TangCK:normal:password

拆分功能:

std::vector<std::string> split(std::string const& str, std::string const& delimiters = "#") {
  std::vector<std::string> tokens;

  // Skip delimiters at beginning.
  string::size_type lastPos = str.find_first_not_of(delimiters, 0);
  // Find first "non-delimiter".
  string::size_type pos = str.find_first_of(delimiters, lastPos);

  while (string::npos != pos || string::npos != lastPos) {
    // Found a token, add it to the vector.
    tokens.push_back(str.substr(lastPos, pos - lastPos));
    // Skip delimiters.  Note the "not_of"
    lastPos = str.find_first_not_of(delimiters, pos);
    // Find next "non-delimiter"
    pos = str.find_first_of(delimiters, lastPos);
  }
  return tokens;
}



std::vector<std::string> split(std::string const& str, char const delimiter) {
  return split(str,std::string(1,delimiter));
}
4

3 回答 3

3

在你愉快地假设向量包含至少 4 个元素之前,你应该做一些基本的输入检查,否则y[3]当你解析一行没有三个冒号的输入时会爆炸:

if (y.size >= 4) {
   // Do login check
} else {
   // Invalid input
}

我猜你的输入中可能有一个空行。

包装依赖读取“a:b:c:d”输入行的整个代码部分:

if(action=="auth") {
  myfile.open("account.txt");
  while(getline(myfile,sline))
  {
    vector<string> y = split(sline, ':');
    if (y.size >= 4) {
      logincheck = "";
      logincheck = y[0] + ":" + y[3];

      if (sline==actionvalue) {
        sendClient = "login done#Successfully Login.";
        break;
      } else {
        sendClient = "fail login#Invalid username/password.";
      }
    }
  }
  myfile.close();
}
于 2012-08-12T14:04:36.477 回答
1

问题是循环的结构:

while(!myfile.eof())
    {
        getline(myfile,sline);

istream::eof()除非您尝试读取流的末尾,否则不能保证返回 true。所以会发生什么是你读了 2 行eof()但仍然没有返回 true。然后你第三次进入循环。getline由于您在调用后不检查错误,因此您可以sline在其内容未指定时愉快地访问 - 它可能是空的,它仍然可以携带上一次迭代的内容,它可能包含其他内容。

getline()在尝试访问字符串之前,您总是需要检查调用是否成功。惯用的方法是把它放在循环的条件下:

while (getline(myfile, sline)) { /* do your stuff */ }

这样你只有在读取成功时才进入循环体。

于 2012-08-12T15:03:29.577 回答
0

问题是拉最后一个可用行的 getline 调用没有设置 EOF,因此在获得最后一个可用行后,您需要进行一次额外的循环迭代。该循环操作在一条空线上运行,这会导致坏事发生,即 split 不会返回具有四个元素的向量,但随后您尝试访问这些元素。

你可以使用

while (getline(myfile,sline))
{
    // do stuff
}

代替

while(!myfile.eof())
{
    getline(myfile,sline);
    // do stuff
}
于 2012-08-12T15:02:56.763 回答