Как найти количество цифр в файле

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

Вот мой код:

#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's user avatar

Kromster

13.5k12 золотых знаков43 серебряных знака72 бронзовых знака

задан 22 мар в 22:41

Nazar's user avatar

2

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

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;

ответ дан 23 мар в 6:03

Mikhailo's user avatar

MikhailoMikhailo

12.3k2 золотых знака17 серебряных знаков41 бронзовый знак

5

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

#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;
}

ответ дан 22 мар в 23:54

Nikita Kalitin's user avatar

5

Aecttann

6 / 6 / 5

Регистрация: 19.10.2013

Сообщений: 359

1

Подсчитать количество цифр в тексте, записанного в файле.

13.02.2014, 13:44. Показов 3923. Ответов 17

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Необходимо подсчитать количество цифр в тексте. Текст записан в файле. Результат вывести на экран и в файл.

Добавлено через 40 минут
Вот код, но он нерабочий.

Добавлено через 8 минут

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    int x;
    unsigned x1=0;
    setlocale(LC_ALL, "RUS");
 
    ifstream test;
    test.open("test");
 
while (x=getchar()){
    if ('0'<=x)&&(x<='9'){
        x1++;
    }
}
        if(!test){
            cout<< "Неудача!";
        return -1;
        }
        return 0;
}



0



2062 / 618 / 41

Регистрация: 23.10.2011

Сообщений: 4,468

Записей в блоге: 2

13.02.2014, 16:46

2

Лучший ответ Сообщение было отмечено Aecttann как решение

Решение

C++

#include <iostream>
#include <fstream>
using namespace std;
 
 
int main()
{
    char c = 0;
    unsigned x1 = 0;
    setlocale(LC_ALL, "RUS");
 
    ifstream test;
    test.open("test");
    
    if(!test.good())
    {
        cout << "Не удалось открыть файл. Аварийный выход." << endl;
        return -1;
    }
 
 
    while(test.good())
    {
        c = test.get();
        
        if(  ('0' <= c) && (c <= '9')  )
            x1++;
    }
    
    cout << "В файле " << x1 << " цифр." << endl; 
    return 0;
}



1



Esecman

39 / 27 / 12

Регистрация: 31.12.2013

Сообщений: 329

13.02.2014, 17:05

3

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
 
using namespace std;
 
int main() {
 
int NUM_OF_FILE = 0; // отвечает за количество чисел в файле
float n = 0; // в эту переменную вносятся числа из .txt файла :)
// чтобы показать их, нужно ввести в цикле: cout << n << endl;
 
FILE* file;
file = fopen("filename.txt", "r");
 
while(!feof(file)) {
fscanf(file, "%f", &n);
NUM_OF_FILE++;
// cout << n << endl; // показать числа из .txt
}
 
cout << NUM_OF_FILE << endl; // показать количество чисел
 
system("pause");
return 0;
 
}



1



programina

13.02.2014, 18:17

Не по теме:

Цитата
Сообщение от Esecman
Посмотреть сообщение

fscanf(file, “%f”, &n);

Вы считаете числа, а не цифры.



0



DiffEreD

1456 / 793 / 257

Регистрация: 21.06.2011

Сообщений: 1,740

Записей в блоге: 2

13.02.2014, 18:40

5

Как вариант (код С++11):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <iterator>
#include <fstream>
#include <functional>
#include <algorithm>
 
using input = std::istreambuf_iterator<char>;
 
int main()
{
   std::ifstream ifs("file.txt");
   if (!ifs.is_open())
      return 1;
   std::cout << "Count of numbers: -> ";
   std::cout << std::count_if(input(ifs), input(), std::bind(isdigit, std::placeholders::_1));
 
   return 0;
}



1



gray_fox

13.02.2014, 18:49

Не по теме:

DiffEreD, а bind то зачем?



1



DiffEreD

13.02.2014, 19:00

Не по теме:

По привычке…



0



6 / 6 / 5

Регистрация: 19.10.2013

Сообщений: 359

13.02.2014, 22:14

 [ТС]

8

Кликните здесь для просмотра всего текста

Цитата
Сообщение от programina
Посмотреть сообщение

Код C++
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
* * char c = 0;
* * unsigned x1 = 0;
* * setlocale(LC_ALL, “RUS”);
ifstream test;
* * test.open(“test”);
if(!test.good())
* * {
* * * * cout << “Не удалось открыть файл. Аварийный выход.” << endl;
* * * * return -1;
* * }
while(test.good())
* * {
* * * * c = test.get();
if( *(‘0’ <= c) && (c <= ‘9’) *)
* * * * * * x1++;
* * }
cout << “В файле ” << x1 << ” цифр.” << endl; *
* * return 0;
}

Программа выдаёт сообщение, которое в проверке предназначено для того случая, когда не удалось открыть файл, хотя он создан в той же директории, что и все элементы программы.

Если закомментировать проверку:



0



2062 / 618 / 41

Регистрация: 23.10.2011

Сообщений: 4,468

Записей в блоге: 2

13.02.2014, 23:41

9

Aecttann,

if(!test.good())

while(test

.good())



0



Aecttann

6 / 6 / 5

Регистрация: 19.10.2013

Сообщений: 359

13.02.2014, 23:54

 [ТС]

10

Цитата
Сообщение от programina
Посмотреть сообщение

Aecttann,
if(!test.good())
while(test.good())

С

C++
1
good()

программа также не работает:



0



2062 / 618 / 41

Регистрация: 23.10.2011

Сообщений: 4,468

Записей в блоге: 2

14.02.2014, 00:37

11

Aecttann, а файл есть? Как создавали файл? Какое у него расширение?



1



6 / 6 / 5

Регистрация: 19.10.2013

Сообщений: 359

14.02.2014, 00:43

 [ТС]

12

Цитата
Сообщение от programina
Посмотреть сообщение

а файл есть? Как создавали файл? Какое у него расширение?

Есть. В той же папке, где и программа, обычным блокнотом, обычный txt.

Подсчитать количество цифр в тексте, записанного в файле.



0



2062 / 618 / 41

Регистрация: 23.10.2011

Сообщений: 4,468

Записей в блоге: 2

14.02.2014, 00:46

13

Aecttann, вы пытаетесь открывать test вместо test.txt ?



1



6 / 6 / 5

Регистрация: 19.10.2013

Сообщений: 359

14.02.2014, 00:52

 [ТС]

14

Цитата
Сообщение от programina
Посмотреть сообщение

Aecttann, вы пытаетесь открывать test вместо test.txt ?

Сижу в шоке сам с себя
Спасибо Вам



1



2062 / 618 / 41

Регистрация: 23.10.2011

Сообщений: 4,468

Записей в блоге: 2

14.02.2014, 00:54

15

Цитата
Сообщение от Aecttann
Посмотреть сообщение

Спасибо Вам

Пожалуйста.



0



6 / 6 / 5

Регистрация: 19.10.2013

Сообщений: 359

14.02.2014, 00:55

 [ТС]

16

programina, а как произвести запись того, что было выведено на терминал(количество цифр в файле), в отдельный файл?



0



2062 / 618 / 41

Регистрация: 23.10.2011

Сообщений: 4,468

Записей в блоге: 2

14.02.2014, 01:31

17

Aecttann, добавьте в конец кода перед return 0; :

C++

ofstream out;
out.open("out.txt");
out << "В файле " << x1 << " цифр.n";
out.close();



1



6 / 6 / 5

Регистрация: 19.10.2013

Сообщений: 359

14.02.2014, 02:12

 [ТС]

18

programina, ещё раз спасибо



0



I’m reading a text file of numbers and I want to get the sum of this number, how can I determine the number of numbers in the text file.”my text file is consist of one line”

this is the code I have written, how to determine number of numbers in the text file to put it instead of the variable “number of numbers” in the secondline of code

int main()
{
    FILE *file = fopen("numbers.txt", "r");
    int integers[number of numbers];
    int i=0;
    int j=0;
    int num;

    while(fscanf(file, "%d", &num) > 0) {
        integers[i] =num;
        printf("%d",integers[i]);
        printf("n");
        i++;
    }

    int sum=0;
    for(j=0;j<sizeof(integers)/sizeof(int);j++)
    {
        sum=sum+integers[j];
    }

    printf("%d",sum);
    printf("n");
    fclose(file);
    return 0;
}

WhozCraig's user avatar

WhozCraig

65k11 gold badges74 silver badges140 bronze badges

asked Aug 24, 2013 at 21:32

Nidal's user avatar

2

If you want to do this, there are three possible solutions:

  1. make integers quite large (say 10000 elements) and say “Too many numbers” if there are more than the “quite large” number.
  2. Read the file twice, count the number of numbers the first time, second time store them.
  3. Use dynamic allocation, and start with a small number, when that number is reached use realloc to allocate a larger array, until all numbers have been read.

However, in your particular case, what you are doing can be done without at all storing the numbers. So, the whole integers array is completely unnecessary.

Just do:

 sum += num; 

in the first loop.

answered Aug 24, 2013 at 21:40

Mats Petersson's user avatar

Mats PeterssonMats Petersson

126k14 gold badges136 silver badges225 bronze badges

First, figure out if you actually need to save every number. Quite frequently it is possible to do simple data processing by computing some intermediate result without needing to keep every input. For example, it is possible to compute the mean and standard deviation of an input set without keeping the input dataset.

In your specific example, you can print every number as it is read, then accumulate them into sum, without having to keep all of them.

If you decide you really need to keep every number, then you have two options:

  1. Read through the file once to count the number of numbers, then allocate the array, then fseek back to the beginning to read all of them.
  2. Allocate an initial array, then use realloc to progressively increase its size (in this case, make sure to increase the size by a fixed factor when needed, rather than just increasing the size by one).

answered Aug 24, 2013 at 21:41

nneonneo's user avatar

nneonneonneonneo

170k35 gold badges305 silver badges377 bronze badges

If you don’t need individual numbers but only the sum of all of them, what you should do is just add them together at the same time as you read them:

int sum = 0;
int num;
while(fscanf(file, "%d", &num) > 0) {
    sum += num;
    printf("%d",num);
    printf("n");
}

On the other hand, if you really need to keep every single number, you can do it different ways.

  • You could first read the file while counting the numbers, then seek to the beginning, allocate the needed memory and read again saving each number.
  • You can ask for some memory at first, and when you run out (you are going to have to keep track of how many free spaces you have) ask for more memory (realloc), and keep doing that until you are finished.
  • You can use a linked list instead of an array, if you didn’t need random access.

Edit:
If for some case you need to do an avarage, and thus you really need the total amount of numbers you read, just declare a int n = 0; and inside the loop do ++n; so you have it in the end.

answered Aug 24, 2013 at 21:43

rorlork's user avatar

rorlorkrorlork

5235 silver badges15 bronze badges

8

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "logotip.c"
#include <ctype.h>
#include <string.h>
#include <unistd.h>
 
void time_stamp(FILE *f)
   {
   time_t t;
   t=time(NULL);
   fprintf(f,"=====%s=====n",ctime(&t));
   }

int main(int argc,char* argv[])
{
char a1,a2;
char buffer[20],str_file[100];
char mass[100],ch,word[100];
char word_max[100];
//const char ch[200],mass[100];
int a,i,n1,b,count=0,state;
int n;
int j;
FILE *filein,*fileout,*flog;

logo();
printf("Краткое изложение задачи:n");
printf("В текстовом файле найти самую длинную последовательность цифрn");
printf("Выполнил Рожкин Павел Александрович,ИВТ-12n");

sprintf(buffer,"%s.log",argv[0]);
if((flog=fopen(buffer,"a"))==NULL)
     {
       puts("Ошибка открытия журнала");
       puts("Нажмите Enter");
       getchar();
       exit(0);
     }
 
time_stamp(flog);
fprintf(flog,"Программа %s приступила к работе",argv[0]);

if(argc<2)
      {
           time_stamp(flog);
           fprintf(flog,"Ошибка,недостаточно аргументов командной строки,работы завершенаn");
           printf("Ошибка,используйте %s filename1 filename2n",argv[0]);
           getchar();
           fclose(flog);
           exit(0);
      }

if((filein=fopen(argv[1],"r"))==NULL)
{
time_stamp(flog);
fprintf(flog,"Невозможно открыть входной файл %s ,программа завершила работу",argv[1]);
getchar();
fclose(flog);
printf("Невозможно открыть файл %s,программа завершает работуn",argv[1]);
exit(0);
}
     time_stamp(flog);
     fprintf(flog,"Файл %s открыт успешно",argv[1]);

if((fileout=fopen(argv[2],"w"))==NULL)
{
  time_stamp(flog);
fprintf(flog,"Невозможно открыть файл %s ,программа завершила работу",argv[2]);
printf("Невозможно открыть выходной файл %s,программа завершает работуn",argv[2]);
getchar();
fclose(flog);
exit(0);
}

     time_stamp(flog);
     fprintf(flog,"Файл %s открыт успешно",argv[2]);

//printf("asdasdsadn");  
 
state=0;
n=0;
i=0;
while(1)
          {

            ch=fgetc(filein);

            if(feof(filein)) break;
           
                              if(state==0&&isdigit(ch))
                                   {
                                     word[count]=ch;
                                     state=1;
                                     count++;
                                     n++;
                                     //fprintf(fileout,"%c",ch);
                                    continue;
                                   }

                      if(state==0&&!isdigit(ch))
                        {
                          //count=0;
                          n=0;
                          continue;
                         
                        }

                               if(state==1&&!isdigit(ch))
                                 {
                                   word[count]='';
                                   state=0;

                                   if(i==0) {n1=n;i++;}

                                       if(n<n1&&n1!=n)
                                             {
                                               //printf("%cn",word);
                                         //strcpy(word_max,word);
                                             }
                                          else
                                             {
                                                 n1=n;
                                                 strcpy(word_max,word);
                                                 
                                             }
                                       
                                   count=0;
                                   n=0;
                                 }

            if(state==1&&isdigit(ch))
              {
                word[count]=ch;
                count++;
                //fprintf(fileout,"%c",ch);
                n++;
                continue;
              }

          }

fprintf(fileout,"Наибольшая последовательность цифр(она состоит из %d цифр ):%s",n1,word_max);        

printf("Наибольшая последовательность цифр(она состоит из %d цифр )%sn",n1,word_max);

fclose(filein);
fclose(fileout);
fprintf(flog,"Операция выполнена успешно,%s и %s успешно закрыты,программа завершила работу",argv[1],argv[2]);
printf("Операция выполнена успешно,%s и %s успешно закрыты,программа завершает работуn",argv[1],argv[2]);      
getchar();
fclose(flog);
exit(0);

}

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    >
    Как более рационально подсчитать количество чисел в файле?

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему



    Сообщ.
    #1

    ,
    23.12.07, 13:21

      Junior

      *

      Рейтинг (т): 2

      Задача такая: есть текстовый файл с неизвестным количеством вещественных чисел, расположены они могут быть совершенно произвольно (на разных строках, с некоторым числом пробелов между собой). Их может быть очень много, так что быстрота алгоритма здесь важна. Нужно все эти числа из файла перегнать в массив для дальнейшей работы с ними.
      Я придумал вот что. Конечно способ извращённый, но работает))
      В каждом вещественном числе есть точка, т.о., если пересчитать кол-во точек, встречающихся в файле, можно получить количество чисел. Далее, создаю динамический массив, с размерностью равной этому количеству и функцией scanf загоняю туда все эти числа.
      Вот такой вот код получается:

      ExpandedWrap disabled

        cout<<“Vvedite nazvanie textovogo faila: “;

        char filename[255];

        cin>>filename;

        ifstream from(filename);

           if (!from)

           {

            cout<<“Error with file open!”;

            getch();

            exit(1);

           }

        char ch; int sch=0;

           while (!from.eof())

           {

              from.get(ch);

                 if (ch==’.’) sch++;

           }

        from.close();

        float *mas = new float[sch];

        freopen(filename,”r”,stdin);

           for (int i=0;i<sch;i++)

              scanf(“%e”,&mas[i]);

        fclose(stdin);

      Сообщение отредактировано: Kp0T – 23.12.07, 13:24


      amk



      Сообщ.
      #2

      ,
      23.12.07, 15:28

        А если у числа дробная часть нулевая, и тот, кто готовит данные, решит точку с нулями не писать?
        С тем же успехом ты можешь посчитать число не пробельных последовательностей (число должно писаться слитно)
        Программа получится несколько длиннее

        ExpandedWrap disabled

             // … Это только фрагмент подсчета чисел

             char ch; int sch;

             bool inword = false;

             from.get(ch);

             while (!from.eof())

             {

                if (inword)

                {

                   if (isspace(ch))

                   {

                      inword = false;

                   }

                }

                else

                {

                   if (!isspace(ch))

                   {

                      sch++;

                      inword = true;

                   }

                }

                from.get(ch);

             }

             // … фрагмент закончился


        MT-Wizard



        Сообщ.
        #3

        ,
        23.12.07, 15:29

          Member

          **

          Рейтинг (т): 8

          По умолчанию потоки ввода (istream и ему подобные) игнорируют пробелы, которые встретят. Поэтому сразу возникает идея:
          Циклом читать в переменные типа double, а пробелы проигнорирует сам поток. При этом возникнет проблема с концом файла, т.к. если в конце есть пробелы, то при их чтении взведётся failbit, и это надо отдельно обработать. Вообще, реализация примерно такая:

          ExpandedWrap disabled

            vector<double> numbers; // массив результатов

            while (!from.eof())

            {

                double num; from >> num;

                if (from.fail())

                {

                    if (from.eof()) // если оказалось, что не удалось прочитать число, но файл закончился

                    {

                        // разобраться, были ли здесь неправильные символы.

                        // если нет (только пробелы и энтеры), то выйти из цикла – break

                    }

                    // сюда мы попадаем, если внутри файла оказалось неправильно записанное число

                    // обработать ошибочные данные в файле

                    return 2;

                }

                numbers.push_back(num); // добавить удачно прочитанное число

            }


          Mayk



          Сообщ.
          #4

          ,
          23.12.07, 15:45

            Цитата Kp0T @ 23.12.07, 13:21

            Их может быть очень много, так что быстрота алгоритма здесь важна. Нужно все эти числа из файла перегнать в массив для дальнейшей работы с ними.
            Я придумал вот что. Конечно способ извращённый, но работает))

            Преждевременная оптимизация — корень всех зол.
            Тупое

            ExpandedWrap disabled

                  std::ifstream in(“input.txt”);

                  std::vector<double> vec;

                  std::copy(

                      std::istream_iterator<double>(in),

                      std::istream_iterator<double>(),

                      std::back_inserter(vec)

                  );

            грузит всё в вектор.

            пока профайлер не скажет что диск тормозит сильно сильно — не оптимизировать сей участок.

            Сообщение отредактировано: Mayk – 23.12.07, 15:46


            Kp0T



            Сообщ.
            #5

            ,
            23.12.07, 16:15

              Junior

              *

              Рейтинг (т): 2

              amk,разумеется, такой вариант более универсален, но здесь подразумевается, что вещественная часть обязательно задана, даже если она равна 0, т.е. точка всегда есть.

              MT-Wizard,Mayk дело в том, что STL в данной проге использовать нельзя, надо как-то обойтись более “стандартными” средствами.

              Вообще, дело в том, что меня как-то напрягает, что файл в итоге прокручивается дважды: при подсчёте кол-ва чисел и при их считывании в массив. Хотелось бы как-то этого избежать, но видимо не получится…


              Mayk



              Сообщ.
              #6

              ,
              23.12.07, 16:31

                Цитата Kp0T @ 23.12.07, 16:15

                MT-Wizard,Mayk дело в том, что STL в данной проге использовать нельзя, надо как-то обойтись более “стандартными” средствами.

                А что-то бывает стандартнее стандарта? ну да ладно.

                Цитата Kp0T @ 23.12.07, 16:15

                Вообще, дело в том, что меня как-то напрягает, что файл в итоге прокручивается дважды: при подсчёте кол-ва чисел и при их считывании в массив. Хотелось бы как-то этого избежать, но видимо не получится…

                почему же. можно либо через realloc,
                либо через new double [старыйразмер*2] + std::copy [или что в программе не в опале]
                выделить массив большого объема и считывать данные в него
                [читать: изобрести std::vector самостоятельно]

                Сообщение отредактировано: Mayk – 23.12.07, 16:32


                Kp0T



                Сообщ.
                #7

                ,
                23.12.07, 18:50

                  Junior

                  *

                  Рейтинг (т): 2

                  Mayk, сделал при помощи realloc, всё ок!


                  AndreyK



                  Сообщ.
                  #8

                  ,
                  24.12.07, 15:39

                    Member

                    **

                    Рейтинг (т): 2

                    Я бы из текстового файла перегнал всё в двоичный.

                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                    0 пользователей:

                    • Предыдущая тема
                    • C/C++: Общие вопросы
                    • Следующая тема

                    Рейтинг@Mail.ru

                    [ Script execution time: 0,0559 ]   [ 16 queries used ]   [ Generated: 16.05.23, 09:15 GMT ]  

                    Добавить комментарий