1

私はファイルを持っています:

name1 8
name2 27
name3 6

そして私はそれをベクトルに解析しています。これは私のコードです:

  int i=0;
  vector<Student> stud;

  string line;
  ifstream myfile1(myfile);
  if (!myfile1.is_open()) {return false;}
  else {
    while( getline(myfile1, line) ) {
      istringstream iss(line);
      stud.push_back(Student());
      iss >> stud[i].Name >> stud[i].Grade1;
      i++;
    }
    myfile1.close();
  }

stud[i].Grade1がintであるかどうかを確認する必要があります。そうでない場合は、falseを返します。ファイルには次のものを含めることができます。

name1 haha
name2 27
name3 6

どうすればいいですか?

編集:

私は別の方法(getlineなし)を試しましたが、うまくいくようです。理由がわかりません:/

int i=0;
vector<Student> stud;

ifstream myfile1(myfile);
if (!myfile1.is_open()) {return false;}
else {
  stud.push_back(Student());
  while( myfile1 >> stud[i].Name ) {
    if(!(myfile1 >> stud[i].Points1)) return false;
    i++;
    stud.push_back(Student());
}
myfile1.close();
}
4

2 に答える 2

1

Grade1のような数値のタイプの場合int、使用std::istringstream::fail()

// ...
    while( getline(myfile1, line) ) {
      istringstream iss(line);
      stud.push_back(Student());
      iss >> stud[i].Name;
      iss >> stud[i].Grade1;
      if (iss.fail())
        return false;
      i++;
    }
    myfile1.close();
  }
// ...
于 2013-03-14T20:01:03.250 に答える
1

次のようになります。

std::vector<Student> students;
std::ifstream myfile1(myfile);
if (!myfile1.is_open())
    return false;

std::string line;
while (std::getline(myfile1, line))
{
    // skip empty lines:
    if (line.empty()) continue;

    Student s;
    std::istringstream iss(line);
    if (!(iss >> s.Name))
        return false;
    if (!(iss >> s.Grade1))
        return false;

    students.push_back(s);
}

iss >> s.Grade110進数だけでなく、8進数と16進数でも成功することに注意してください。10 進数値のみが読み取られることを確認するには、それを一時std::stringオブジェクトに読み取り、それを使用して数値を取得する前に検証することができます。C++ で文字列が数値かどうかを判断する方法をご覧ください

于 2013-03-14T20:06:09.493 に答える