-1

Я уже пытался что-то реализовать, но безуспешно. В файле текст + цифры. Мне нужно подсчитать именно количество цифр

Вот мой код:

#include<iostream>
#include <cstdlib>
#include <string>
#include <fstream>
using namespace std;

int main() { int num; int k = 0; ifstream file("open1.txt"); //string str; if (!file) { cout << " file is not found" << endl; exit(1); } while (file >> num) { k++;
} cout << "Number in file:" << k << endl; file.close(); return 0; }

Kromster
  • 13,809
Nazar
  • 1
  • 1

2 Answers2

4

Если именно цифр то вполне достаточно четырех строк:

ifstream file("open1.txt");
int k = 0;
for(char c; file>>c; k += isdigit(c)!=0);
cout << k;

Если файл не открылся, выведет 0.

Если вы хотите что-то делать с ними - что именно, непонятно, ПОЛУЧИТЬ В КОНСОЛЬ это что-то странное... - то

ifstream file("open1.txt");
int k = 0;
for(char c; file>>c; ) {
    if (isdigit(c)) {
        ++k;
        // Тут вы ПОЛУЧАЕТЕ В КОНСОЛЬ символ с
        }
    };
cout << k;
Mikhajlo
  • 12,592
  • Я извиняюсь спасибо за ответ он правильный но мне эти цифры (только цифры) необходимо получить из файла в консоль что бы Я мог потом з ними работать к примеру: получения количества положительных и отрицательных цифр, количество парных и не парных, какая цифра самая большая а какая самая маленькая и перезаписи этих цифр в другой файл к примеру. – Nazar Mar 23 '23 at 12:20
  • 1
    Давайте по-честному: вы написали Мне нужно подсчитать именно количество цифр. Вы понимаете, что то, что вы сейчас написали - это ДРУГАЯ задача? И за то, что это ВЫ написали условие неверно, мне ставите минус? – Mikhajlo Mar 23 '23 at 14:40
  • @Nazar отрицательных цифр не бывает. Да и положительных цифр в общем-то тоже; цифры — это просто знаки, из которых составляются числа – andreymal Mar 23 '23 at 17:22
  • @andreymal, ну вообще я могу создать систему счисления с цифрами -1, 0 и +1. – Qwertiy Mar 23 '23 at 19:35
  • char c; ... isdigit(c)UB. – wololo Mar 23 '23 at 19:58
1

Попробуйте вот такой код:

#include <iostream>
#include <cstdlib>
#include <string>
#include <fstream>
/*подключим функцию isdigit()*/
#include <ctype.h>

using namespace std;

int main() { int k = 0;

ifstream file("input.txt");

//если файл открылся if(file.is_open()){ char mychar; /переменная буфер для посимвольного чтения/ while (file) { mychar = file.get(); if(isdigit(mychar)){ /если считанный символ - цифра, увеличим счётчик/ k++; }

} }

cout << "Number in file:" << k << endl;

file.close(); return 0; }

  • 2
    isdigit(mychar) -> isdigit((unsigned char)mychar). https://en.cppreference.com/w/cpp/string/byte/isdigit – Stanislav Volodarskiy Mar 23 '23 at 06:52
  • Я извиняюсь спасибо за ответ он правильный но мне эти цифры (только цифры) необходимо получить из файла в консоль что бы Я мог потом з ними работать к примеру: получения количества положительных и отрицательных цифр, количество парных и не парных, какая цифра самая большая а какая самая маленькая и перезаписи этих цифр в другой файл к примеру. – Nazar Mar 23 '23 at 11:59
  • 1
    @StanislavVolodarskiy, тут история даже более запутанная. Во-первых цикл чтения организован неверно. Сперва считываем символ file.get(), обрабатываем его и только потом, на следующей итерации цикла проверяем, а что мы там вообще говоря считали while (file). Во-вторых, вызов get() возвращает значение типа std::ifstream::int_type. Функция отображения из char в std::ifstream::int_type и обратно определяется реализацией. Не гарантируется, что преобразование с помощью простого приведения типа (char mychar = file.get();) даст корректный результат. – wololo Mar 23 '23 at 19:55
  • 1
    Нужно использовать специальную функцию char mychar = std::ifstream::traits_type::to_char_type( file.get() );. (Либо использовать перегруженную версию функции get, которая принимает объект типа char по ссылке: file.get(mychar).) И только потом приводить к unsigned char: isdigit((unsigned char)mychar). – wololo Mar 23 '23 at 19:55
  • Задача явно уровня школы/1 курса универа (нулевых годов, сейчас незнаю), поэтому, имхо, мой вариант вполне рабочий (цифры он считает - а перегрузка, трейты и т.д. это уже уровень повыше. Другое дело, как действительно стоит задача? Чего хочет "заказчик"? Судя по всему, "заказчику" надо разобраться с терминами и правильно задать вопрос. (И скорее всего либо задача будет примерно такая-же по простоте, либо вылезут подводные камни и необходимость работать с памятью/динамическими массивами и т.д.) – Nikita Kalitin Mar 25 '23 at 21:34