Идентификация String или Int из ifstream - PullRequest
1 голос
/ 24 октября 2019

Я пытаюсь определить, является ли ввод из ifstream целым числом или строкой в ​​C ++ 11. ifstream выдаст либо строку, либо int, и мне нужно сделать разные вещи для каждого. Если это int, мне нужно использовать первые два в качестве местоположения в 2d массиве с третьим в качестве значения. Если это строка, мне нужно создать объект NodeData.

   for (;;) {

  int n1, n2, n3;
  string s1;
  infile >> s1;
  //trying isdigit and casting string to int
  if (isdigit( stoi(s1.c_str()))) {
     //check if last 2 ints exist
     if ((infile >> n2 >> n3)) {
        n1 = stoi(s1);
        //end of input check
        if (n1 == 0) {
           break;
        }

        C[n1][n2] = n3;
     }
  }
  else {
     NodeData temp = NodeData(s1);
     data[size] = temp;
     size++;
  }

} Я пробовал isdigit и несколько разных типов приведения, но они не работали. Он продолжает думать, что число в строке не является целым числом, когда оно есть.

Ответы [ 2 ]

1 голос
/ 24 октября 2019

Вы можете записать непосредственно в int и проверить возвращаемое значение операции:

if (infile >> in1)
{
    //in1 contains the int
}
else if (infile >> s1)
{
    //s1 contains the string
}

пример: https://ideone.com/g4YkOU

1 голос
/ 24 октября 2019

isdigit(ch) просто проверит, можно ли считать данный параметр ch цифрой (например, если '0' <= ch <= '9' для большинства языков).

stoi вызовет исключение, если вы вызовете его сстрока, которая не представляет число. Так что вы можете использовать try / catch здесь:

string s1;
int i1;
bool isInt;
infile >> s1;

try {
    i1 = std::stoi(s1);
    isInt = true;
    // s1 was successfully parsed as a string -> use as int.
}
catch(const std::exception &) {
    isInt = false;
    // now we know that s1 could not be parsed as an int -> use as string.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...