2016-04-23 3 views
0

Так что мне нужно знать, как идентифицировать строку текста и выводить, какой тип данных он есть, например, если строка говорит 123, она должна выводиться как 123 int.Как определить тип данных из файла

Сейчас моя программа идентифицирует только boolean, string и char. Как мне рассказать, если это int или double?

int main() { 
    string line; 
    string arr[30]; 
    ifstream file("pp.txt"); 
    if (file.is_open()){ 
     for (int i = 0; i <= 4; i++) { 
      file >> arr[i]; 
      cout << arr[i]; 
      if (arr[i] == "true" || arr[i] == "false") { 
       cout << " boolean" << endl; 

      } 
      if (arr[i].length() == 1) { 
       cout << " character" << endl; 

      } 
      if (arr[i].length() > 1 && arr[i] != "true" && arr[i] != "false") { 
       cout << " string" << endl; 
      } 
     } 
     file.close(); 
    } 
    else 
     cout << "Unable to open file"; 
    system("pause"); 
} 

Благодаря

+0

Вы можете использовать регулярное выражение? если он соответствует \ d + \. \ d +, тогда у нас есть double, и если он соответствует \ d + $, тогда мы имеем int – saml

+0

. Существует бесконечный набор чисел, который может быть либо целым, либо с плавающей точкой. Значение 123 может быть значением с плавающей запятой или целым числом. Некоторые алгоритмы используют десятичную точку, так что 123 является целым числом, а 123. является плавающей точкой. Для некоторых реализаций требуется научное обозначение: 1.23E + 2. –

ответ

1

Использование регулярных выражений: http://www.cplusplus.com/reference/regex/

#include <regex> 
std::string token = "true"; 
std::regex boolean_expr = std::regex("^false|true$"); 
std::regex float_expr = std::regex("^\d+\.\d+$"); 
std::regex integer_expr = std::regex("^\d+$"); 
... 
if (std::regex_match(token, boolean_expr)) { 
    // matched a boolean, do something 
} 
else if (std::regex_match(token, float_expr)) { 
    // matched a float 
} 
else if (std::regex_match(token, integer_expr)) { 
    // matched an integer 
} 
... 
+1

Напоминание: не все версии C++ имеют функции регулярного выражения. Многие люди, отправляющие в StackOverflow, все еще используют TurboC++, который определенно не поддерживает регулярные выражения C++. –

+0

Как ваше регулярное выражение различает целое число и значение с плавающей запятой? Это то, чего хочет OP. Я спрашиваю, потому что значение 456 может быть целым или плавающим, а регулярное выражение может быть немного сложным. –

+0

Должен быть предпочтительнее стандартный способ. Если компилятор не поддерживает стандартные функции, есть библиотеки, предоставляющие им. Анализ без регулярного выражения является болезненным, поэтому вы лучше знаете его существование и узнаете его. – Rei

Смежные вопросы