Как определить в C ++, является ли элемент в текстовом файле символьным или числовым? - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь написать код на C ++, читая текстовый файл, содержащий ряд цифр. Например, у меня есть этот файл .txt, который содержит следующие серии чисел, смешанных с символом:

1 2 3 a 5

Я пытаюсь сделать код способным распознавать цифры и символы, например 4-ю запись выше (которая является символом), а затем сообщить об ошибке.

То, что я делаю, похоже на

double value;
while(in) {
  in >> value;
  if(!isdigit(value)) {
      cout << "Has non-numeric entry!" << endl;
      break;
  }
  else
      // some codes for storing the entry
}

Однако функция isdigit не работает для текстового файла. Кажется, когда я делаю in >> value, код неявно преобразует a в double.

Может кто-нибудь дать мне какое-нибудь предложение?

Большое спасибо!

Ответы [ 4 ]

0 голосов
/ 02 ноября 2018

Так как, похоже, конечная цель Аскера состоит в том, чтобы иметь значение double для своих собственных гнусных целей, а не просто обнаруживать наличие мусора среди чисел, какого черта. Давайте прочитаем double.

double value;
while (in) // loop until failed even after the error handling case
{
    if (in >> value) // read a double.
    {
        std::cout << value; // printing for now. Store as you see fit
    }
    else // failed to read a double
    {
        in.clear(); // clear error
        std::string junk; 
        in >> junk; // easiest way I know of to read up to any whitepsace. 
                    // It's kinda gross if the discard is long and the string resizes
    }
}

Оговорка:

То, с чем это не может справиться, это что-то вроде 3.14A. Это будет читаться как 3.14 и остановится, вернув 3.14 и оставив A для следующего чтения, где он не сможет выполнить синтаксический анализ, а затем будет использован и отброшен in >> junk; Эффективным отловом, который немного сложнее и покрыт Уильямом Ответ Ли . Если обработка исключений stod считается дорогостоящей, используйте strtod и проверьте, что параметр end достиг конца строки, и ошибки диапазона не были сгенерированы. См. Пример в связанной strtod документации

0 голосов
/ 02 ноября 2018

Ваш while цикл не делает то, что вы думаете, он делает. Он повторяет только одно утверждение:

in >> value;

Остальные операторы фактически находятся вне цикла. Всегда рекомендуется использовать фигурные скобки для тела while

0 голосов
/ 02 ноября 2018

Я создал небольшой мини-скрипт, в котором я буду читать в файле через стандартный объект библиотеки fstream, так как я немного не был уверен в том, что представляет ваше «in».

По сути, попробуйте прочитать каждый элемент как символ и проверить функцию цифр. Если вы читаете в элементах, которые имеют не только длину 1, необходимо внести несколько изменений. Дайте мне знать, если это так, и я постараюсь помочь!

int main() {
    std::fstream fin("detect_char.txt");
    char x;
    while (fin >> x) {
        if (!isdigit(x)) {
            std::cout << "found non-int value = " << x << '\n';
        }
    }
    std::cout << '\n';
    return 0;
}
0 голосов
/ 02 ноября 2018

Попробуйте прочитать токены в string и явно разобрать их

ifstream infile("data.txt");
string token;
while (infile >> token) {
    try {
        double num = stod(token);
        cout << num << endl;
    }
    catch (invalid_argument e) {
        cerr << "Has non-numeric entry!" << endl;
    }
}
...