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 が返されないということです。その後、3 回目のループに入ります。呼び出し後にエラーをチェックしないため、そのコンテンツが指定されていない場合でも問題なくgetlineアクセスslineできます。空である可能性があり、前の反復からのコンテンツがまだ含まれている可能性があり、何か他のものが含まれている可能性があります。

getline()文字列にアクセスする前に、呼び出しが成功したかどうかを常に確認する必要があります。慣用的な方法は、ループの状態に置くことです。

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

このようにして、読み取りが成功した場合にのみループ本体に入ります。

于 2012-08-12T15:03:29.577 に答える
0

問題は、最後の使用可能な行をプルする getline の呼び出しが EOF を設定していないことです。そのため、最後の使用可能な行を取得した後で、余分なループ反復を 1 回実行します。そのループ操作は空の sline で実行されているため、問題が発生します。つまり、split は 4 つの要素を持つベクトルを返さないのに、それらの要素にアクセスしようとします。

あなたはただ使うことができます

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

代わりに

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