Я уже пытался что-то реализовать, но безуспешно. В файле текст + цифры. Мне нужно подсчитать именно количество цифр
Вот мой код:
#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.5k12 золотых знаков43 серебряных знака72 бронзовых знака
задан 22 мар в 22:41
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
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
5
Aecttann 6 / 6 / 5 Регистрация: 19.10.2013 Сообщений: 359 |
||||
1 |
||||
Подсчитать количество цифр в тексте, записанного в файле.13.02.2014, 13:44. Показов 3923. Ответов 17 Метки нет (Все метки)
Необходимо подсчитать количество цифр в тексте. Текст записан в файле. Результат вывести на экран и в файл. Добавлено через 40 минут Добавлено через 8 минут
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 |
|||
1 |
programina |
13.02.2014, 18:17
|
Не по теме:
fscanf(file, “%f”, &n); Вы считаете числа, а не цифры.
0 |
DiffEreD 1456 / 793 / 257 Регистрация: 21.06.2011 Сообщений: 1,740 Записей в блоге: 2 |
||||
13.02.2014, 18:40 |
5 |
|||
Как вариант (код С++11):
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 |
Кликните здесь для просмотра всего текста
Код C++
Программа выдаёт сообщение, которое в проверке предназначено для того случая, когда не удалось открыть файл, хотя он создан в той же директории, что и все элементы программы.
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 |
|||
Aecttann, С
программа также не работает:
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 |
а файл есть? Как создавали файл? Какое у него расширение? Есть. В той же папке, где и программа, обычным блокнотом, обычный 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 |
Aecttann, вы пытаетесь открывать test вместо test.txt ? Сижу в шоке сам с себя
1 |
2062 / 618 / 41 Регистрация: 23.10.2011 Сообщений: 4,468 Записей в блоге: 2 |
|
14.02.2014, 00:54 |
15 |
Спасибо Вам Пожалуйста.
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
65k11 gold badges74 silver badges140 bronze badges
asked Aug 24, 2013 at 21:32
2
If you want to do this, there are three possible solutions:
- make
integers
quite large (say 10000 elements) and say “Too many numbers” if there are more than the “quite large” number. - Read the file twice, count the number of numbers the first time, second time store them.
- 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 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:
- 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. - 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
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
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); }
|
|
|
Как более рационально подсчитать количество чисел в файле?
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Junior Рейтинг (т): 2 |
Задача такая: есть текстовый файл с неизвестным количеством вещественных чисел, расположены они могут быть совершенно произвольно (на разных строках, с некоторым числом пробелов между собой). Их может быть очень много, так что быстрота алгоритма здесь важна. Нужно все эти числа из файла перегнать в массив для дальнейшей работы с ними.
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 |
|
А если у числа дробная часть нулевая, и тот, кто готовит данные, решит точку с нулями не писать?
// … Это только фрагмент подсчета чисел 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 |
|
Member Рейтинг (т): 8 |
По умолчанию потоки ввода (istream и ему подобные) игнорируют пробелы, которые встретят. Поэтому сразу возникает идея:
vector<double> numbers; // массив результатов while (!from.eof()) { double num; from >> num; if (from.fail()) { if (from.eof()) // если оказалось, что не удалось прочитать число, но файл закончился { // разобраться, были ли здесь неправильные символы. // если нет (только пробелы и энтеры), то выйти из цикла – break } // сюда мы попадаем, если внутри файла оказалось неправильно записанное число // обработать ошибочные данные в файле return 2; } numbers.push_back(num); // добавить удачно прочитанное число } |
Mayk |
|
Цитата Kp0T @ 23.12.07, 13:21
Их может быть очень много, так что быстрота алгоритма здесь важна. Нужно все эти числа из файла перегнать в массив для дальнейшей работы с ними.
Преждевременная оптимизация — корень всех зол.
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 |
|
Junior Рейтинг (т): 2 |
amk,разумеется, такой вариант более универсален, но здесь подразумевается, что вещественная часть обязательно задана, даже если она равна 0, т.е. точка всегда есть. MT-Wizard,Mayk дело в том, что STL в данной проге использовать нельзя, надо как-то обойтись более “стандартными” средствами. Вообще, дело в том, что меня как-то напрягает, что файл в итоге прокручивается дважды: при подсчёте кол-ва чисел и при их считывании в массив. Хотелось бы как-то этого избежать, но видимо не получится… |
Mayk |
|
Цитата Kp0T @ 23.12.07, 16:15 MT-Wizard,Mayk дело в том, что STL в данной проге использовать нельзя, надо как-то обойтись более “стандартными” средствами. А что-то бывает стандартнее стандарта? ну да ладно. Цитата Kp0T @ 23.12.07, 16:15 Вообще, дело в том, что меня как-то напрягает, что файл в итоге прокручивается дважды: при подсчёте кол-ва чисел и при их считывании в массив. Хотелось бы как-то этого избежать, но видимо не получится…
почему же. можно либо через realloc, Сообщение отредактировано: Mayk – 23.12.07, 16:32 |
Kp0T |
|
Junior Рейтинг (т): 2 |
Mayk, сделал при помощи realloc, всё ок! |
AndreyK |
|
Member Рейтинг (т): 2 |
Я бы из текстового файла перегнал всё в двоичный. |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- C/C++: Общие вопросы
- Следующая тема
[ Script execution time: 0,0559 ] [ 16 queries used ] [ Generated: 16.05.23, 09:15 GMT ]