#include <iostream>
#include <fstream>
// #include <cctype>
// Программа, которая считает количество цифр в текстовом файле
// При отсутствии имени файла возвращает код ошибки -1
// При проблеме с открытием файла возвращает код ошибки -2
int main(int argc, char** argv) {
if (argc != 2) {
// Если количество аргументов не равно двум, завершить программу с кодом ошбки -1
// Вывести суть проблемы в стандартный поток ошибок
std::cerr << "Enter one name of file as an argument!\n";
return -1;
}
std::ifstream file_descriptor(argv[1], std::ios::in);
if (!file_descriptor) {
// В случае если возникла ошибка во время открытия файла
std::cerr << "Can\'t open file with name \"" << argv[1] << "\"!\n";
return -2;
}
// Файл открылся, можно читать
int digits_counter = 0;
// Цикл ниже закончится тогда, когда закончится файл (ну или формально, возникнет ошибка другого рода)
// Значение поля eofbit в объекте file_descripor, задастся методом get, тогда цикл закончится
while (file_descriptor) {
int symbol = file_descriptor.get();
// Вариант номер один, с использованием свойства символов в таблице кодировки
if ((symbol >= '0') && (symbol <= '9')) {
++digits_counter;
}
/*
// Вариант номер два, с использованием заголовочника <cctype>
// isdigit вернет 1, если симовол есть цифра
if (isdigit(symbol)) {
++digits_counter;
}
*/
}
file_descriptor.close();
std::cout << "File \"" << argv[1] << "\" has " << digits_counter << " digit(s).\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnN0cmVhbT4KLy8gI2luY2x1ZGUgPGNjdHlwZT4KCi8vINCf0YDQvtCz0YDQsNC80LzQsCwg0LrQvtGC0L7RgNCw0Y8g0YHRh9C40YLQsNC10YIg0LrQvtC70LjRh9C10YHRgtCy0L4g0YbQuNGE0YAg0LIg0YLQtdC60YHRgtC+0LLQvtC8INGE0LDQudC70LUKLy8g0J/RgNC4INC+0YLRgdGD0YLRgdGC0LLQuNC4INC40LzQtdC90Lgg0YTQsNC50LvQsCDQstC+0LfQstGA0LDRidCw0LXRgiDQutC+0LQg0L7RiNC40LHQutC4IC0xCi8vINCf0YDQuCDQv9GA0L7QsdC70LXQvNC1INGBINC+0YLQutGA0YvRgtC40LXQvCDRhNCw0LnQu9CwINCy0L7Qt9Cy0YDQsNGJ0LDQtdGCINC60L7QtCDQvtGI0LjQsdC60LggLTIKCgppbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKCiAgICBpZiAoYXJnYyAhPSAyKSB7CiAgICAgICAgLy8g0JXRgdC70Lgg0LrQvtC70LjRh9C10YHRgtCy0L4g0LDRgNCz0YPQvNC10L3RgtC+0LIg0L3QtSDRgNCw0LLQvdC+INC00LLRg9C8LCDQt9Cw0LLQtdGA0YjQuNGC0Ywg0L/RgNC+0LPRgNCw0LzQvNGDINGBINC60L7QtNC+0Lwg0L7RiNCx0LrQuCAtMQogICAgICAgIC8vINCS0YvQstC10YHRgtC4INGB0YPRgtGMINC/0YDQvtCx0LvQtdC80Ysg0LIg0YHRgtCw0L3QtNCw0YDRgtC90YvQuSDQv9C+0YLQvtC6INC+0YjQuNCx0L7QugogICAgICAgIHN0ZDo6Y2VyciA8PCAiRW50ZXIgb25lIG5hbWUgb2YgZmlsZSBhcyBhbiBhcmd1bWVudCFcbiI7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgc3RkOjppZnN0cmVhbSBmaWxlX2Rlc2NyaXB0b3IoYXJndlsxXSwgc3RkOjppb3M6OmluKTsKICAgIGlmICghZmlsZV9kZXNjcmlwdG9yKSB7CiAgICAgICAgLy8g0JIg0YHQu9GD0YfQsNC1INC10YHQu9C4INCy0L7Qt9C90LjQutC70LAg0L7RiNC40LHQutCwINCy0L4g0LLRgNC10LzRjyDQvtGC0LrRgNGL0YLQuNGPINGE0LDQudC70LAKICAgICAgICBzdGQ6OmNlcnIgPDwgIkNhblwndCBvcGVuIGZpbGUgd2l0aCBuYW1lIFwiIiA8PCBhcmd2WzFdIDw8ICJcIiFcbiI7CiAgICAgICAgcmV0dXJuIC0yOwogICAgfQogICAgLy8g0KTQsNC50Lsg0L7RgtC60YDRi9C70YHRjywg0LzQvtC20L3QviDRh9C40YLQsNGC0YwKICAgIGludCBkaWdpdHNfY291bnRlciA9IDA7CiAgICAvLyDQptC40LrQuyDQvdC40LbQtSDQt9Cw0LrQvtC90YfQuNGC0YHRjyDRgtC+0LPQtNCwLCDQutC+0LPQtNCwINC30LDQutC+0L3Rh9C40YLRgdGPINGE0LDQudC7ICjQvdGDINC40LvQuCDRhNC+0YDQvNCw0LvRjNC90L4sINCy0L7Qt9C90LjQutC90LXRgiDQvtGI0LjQsdC60LAg0LTRgNGD0LPQvtCz0L4g0YDQvtC00LApCiAgICAvLyDQl9C90LDRh9C10L3QuNC1INC/0L7Qu9GPIGVvZmJpdCDQsiDQvtCx0YrQtdC60YLQtSBmaWxlX2Rlc2NyaXBvciwg0LfQsNC00LDRgdGC0YHRjyDQvNC10YLQvtC00L7QvCBnZXQsINGC0L7Qs9C00LAg0YbQuNC60Lsg0LfQsNC60L7QvdGH0LjRgtGB0Y8KICAgIHdoaWxlIChmaWxlX2Rlc2NyaXB0b3IpIHsKICAgICAgICBpbnQgc3ltYm9sID0gZmlsZV9kZXNjcmlwdG9yLmdldCgpOwogICAgICAgIC8vINCS0LDRgNC40LDQvdGCINC90L7QvNC10YAg0L7QtNC40L0sINGBINC40YHQv9C+0LvRjNC30L7QstCw0L3QuNC10Lwg0YHQstC+0LnRgdGC0LLQsCDRgdC40LzQstC+0LvQvtCyINCyINGC0LDQsdC70LjRhtC1INC60L7QtNC40YDQvtCy0LrQuAogICAgICAgIGlmICgoc3ltYm9sID49ICcwJykgJiYgKHN5bWJvbCA8PSAnOScpKSB7CiAgICAgICAgICAgICsrZGlnaXRzX2NvdW50ZXI7CiAgICAgICAgfQogICAgICAgIC8qCiAgICAgICAgLy8g0JLQsNGA0LjQsNC90YIg0L3QvtC80LXRgCDQtNCy0LAsINGBINC40YHQv9C+0LvRjNC30L7QstCw0L3QuNC10Lwg0LfQsNCz0L7Qu9C+0LLQvtGH0L3QuNC60LAgPGNjdHlwZT4KICAgICAgICAvLyBpc2RpZ2l0INCy0LXRgNC90LXRgiAxLCDQtdGB0LvQuCDRgdC40LzQvtCy0L7QuyDQtdGB0YLRjCDRhtC40YTRgNCwCiAgICAgICAgaWYgKGlzZGlnaXQoc3ltYm9sKSkgewogICAgICAgICAgICArK2RpZ2l0c19jb3VudGVyOwogICAgICAgIH0KICAgICAgICAqLwogICAgfQogICAgZmlsZV9kZXNjcmlwdG9yLmNsb3NlKCk7CiAgICBzdGQ6OmNvdXQgPDwgIkZpbGUgXCIiIDw8IGFyZ3ZbMV0gPDwgIlwiIGhhcyAiIDw8IGRpZ2l0c19jb3VudGVyIDw8ICIgZGlnaXQocykuXG4iOwogICAgcmV0dXJuIDA7Cn0=