Как подсчитать числа из текстового файла на C

Итак, моя программа должна принимать ввод из файла, читать каждый символ и помещать частоту символов в выходной файл. Если символ является числом, он должен выдавать сумму всех чисел (не цифр) в тексте. Например, ввод из файла — «aae 40 20», он должен выдавать сумму чисел, то есть 60 и так on. Пока я закончил с частотой каждого символа. Кажется, я не могу понять, как выдать сумму всех чисел в качестве вывода. Вот мой код:

  #include  #include   char input_datei [20];  char алфавит [26] = {'a', 'b', 'c', 'd', 'e', ​​'f', 'g', 'h', 'i', 'j', 'k'  , 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', '  x ',' y ',' z '}; //Создание массива частот для подсчета частоты каждого алфавита int frequency [26] = {0}; void textAnalysieren (FILE * input, FILE * output, char character, int counter); int main () {//Требуется  Имя файла должно содержать не более 20 символов.  put ("Укажите имя файла для анализа!");  scanf ("% 20s", input_datei);  int counter = 0;  символ char;  ФАЙЛ * in = fopen (input_datei, "r"); //Если файл не существует if (in == 0) {printf ("Ошибка при открытии файла  nФайл может не существовать!  N");  возврат 1;  } ФАЙЛ * out = fopen ("ausgabe.txt", "w");  textAnalysieren (вход, выход, символ, счетчик); //закрываем файлы fclose (in);  fclose (выход);  return EXIT_SUCCESS;} void textAnalysieren (FILE * input, FILE * output, char character, int counter) {//Цикл по каждому символу в FIle feof return true, когда EOF найден while ((character = fgetc (input))!  = EOF) {//Различия между числами и символами!  если ((символ> = 48) && (символ  = 48) && ((символ + 1)  

Я новичок в программировании … и я придумал этот грязный код … код должен быть понятным. Попробуйте скомпилировать и запустить. Я не могу хорошо объяснять по-английски. Обычно я превращаю каждую комбинацию цифр в строку и использую функцию atoi (), чтобы сделать ее целым.

  `//счетчик частоты букв и чисел # include   #include  #include  #include  #define MAX_LEN 26 # определить FILE_NAME_LEN 40int main (int argc, char ** argv) {int letter_pos (char);  char c;  int flag = 0; //это необходимо для проверки наличия символа цифры int sum = 0; //сумма, которая будет здесь храниться, это может быть тип long int lfc [MAX_LEN]; //массив частотомера букв char fn [FILE_NAME_LEN]; //имя файла char temp_num [6]; //числовая строка, изменить длину, но внимательно относиться к диапазону типов.  использовать для хранения комбинаций цифр и символов printf («Введите имя файла для чтения:»); //запрос пользователя ввести имя текстового файла для чтения scanf ("% s", fn);  ФАЙЛ * f_in = fopen (fn, "r");  если (! f_in) {ошибка (fn);  вернуть EXIT_FAILURE;  } ФАЙЛ * f_out = fopen ("afc_out.txt", "w"); //имя файла вывода для (int i = 0; i  0) sum + = atoi (temp_num);  flag = 0;  для (int i = 0; i  0) sum + = atoi (temp_num);  flag = 0;  для (int i = 0; i  

`

Примечание: файл для чтения должен находиться в той же папке с исполняемый файл.


У одного есть два отдельных требования:

  • Распечатать гистограмму определенных символов латинского алфавита без ударения (я предполагаю, что a и A находятся в той же корзине.)
  • Настройте фильтр, который отбрасывает нечисловой ввод и суммирует числа последовательных байтов по основанию 10.

Это упрощается тем, что в гистограмме отсутствуют числа, что позволяет нам обрабатывать проблемы отдельно и одновременно (за один проход). Например, здесь используется re2c для упрощения лексирования, ( 'x' соответствует без учета регистра. )

  #include  #include  #include  #include  #include   #include  Сканер структуры {size_t line;  char * from, * курсор;  длинная история [26];  long sum;};/*! re2cre2c: yyfill: enable = 0; re2c: define: YYCTYPE = char; re2c: define: YYCURSOR = s-> cursor; newline = " n" |  (" r" " n"?); dec = [1-9] [0-9] *; end = " x00"; *//** Возвращает успех или неудачу, в этом случае `errno` будет  быть установлен.  */static int lex (struct Scanner * s) {assert (s); scan: s-> from = s-> cursor;/*! re2c * {goto scan;  } конец {возврат 1;  } новая строка {s-> line ++;  перейти к сканированию;  } 'а' {s-> hist [0] ++;  перейти к сканированию;  } 'b' {s-> hist [1] ++;  перейти к сканированию;  } 'c' {s-> hist [2] ++;  перейти к сканированию;  } 'd' {s-> hist [3] ++;  перейти к сканированию;  } 'е' {s-> hist [4] ++;  перейти к сканированию;  } 'е' {s-> hist [5] ++;  перейти к сканированию;  } 'g' {s-> hist [6] ++;  перейти к сканированию;  } 'ч' {s-> hist [7] ++;  перейти к сканированию;  } 'я' {s-> hist [8] ++;  перейти к сканированию;  } 'j' {s-> hist [9] ++;  перейти к сканированию;  } 'k' {s-> hist [10] ++;  перейти к сканированию;  } 'l' {s-> hist [11] ++;  перейти к сканированию;  } 'м' {s-> hist [12] ++;  перейти к сканированию;  } 'п' {s-> hist [13] ++;  перейти к сканированию;  } 'о' {s-> hist [14] ++;  перейти к сканированию;  } 'п' {s-> hist [15] ++;  перейти к сканированию;  } 'q' {s-> hist [16] ++;  перейти к сканированию;  } 'г' {s-> hist [17] ++;  перейти к сканированию;  } 's' {s-> hist [18] ++;  перейти к сканированию;  } 'т' {s-> hist [19] ++;  перейти к сканированию;  } 'u' {s-> hist [20] ++;  перейти к сканированию;  } 'v' {s-> hist [21] ++;  перейти к сканированию;  } 'ш' {s-> hist [22] ++;  перейти к сканированию;  } 'х' {s-> hist [23] ++;  перейти к сканированию;  } 'y' {s-> hist [24] ++;  перейти к сканированию;  } 'z' {s-> hist [25] ++;  перейти к сканированию;  } dec {long no;  char * конец;  no = strtol (s-> from, & end, 10);  if (end == s-> from || (no == LONG_MAX && errno)) return 0;  if ((s-> sum> INT_MAX - нет)) return errno = ERANGE, 0;  s-> сумма + = нет;  перейти к сканированию;  } */} int main (void) {char buffer [256];  struct Scanner s;  int success = EXIT_FAILURE;  size_t i;  memset (& s, 0, sizeof s); /* `hist` и` сумма`.  */s.line = 1;  while ((s.cursor = fgets (буфер, размер буфера, стандартный ввод))) {size_t len ​​= strlen (s.cursor);  утверждать (len> 0);  if (s.cursor [len - 1]! = ' n') {fprintf (stderr, «Строка слишком длинная или встроенные нули.  n»);  errno = ERANGE;  goto catch;  } если (! lex (& s)) goto catch;  } if (ferror (stdin)) goto catch;  for (i = 0; i  = s.cursor));  fprintf (stderr, "Пока на линии% lu:%. * s.  n", (длинное без знака) s.line, (int) (s.cursor - s.from), s. от);  perror ("parsing"); finally: return success;}  

Очень легко переполниться своими требованиями, это обнаружит это и завершит работу.



Подсчитайте, сколько целых чисел находится в текстовом файле, используя fscanf

Например , У меня есть текстовый файл со всеми целыми числами. Я хочу подсчитать, сколько существует целых чисел , чтобы выделить массив.

  int array [0]; int count = 0;  ФАЙЛ * файл = fopen ("file1.txt", "r"); while (fscanf (file, "% d", & array [count]) == 1) {count ++;} printf ("% d", count)  ;  

В настоящее время есть сообщения об ошибках, которые не будут отображаться. Так работает fscanf?


Вы не можете создать массив размером 0. Если вы хотите только подсчитывать количество целых чисел, не используйте Не используйте массив, а только временную переменную. Рекомендуется проверить, правильно ли вы открыли файл, и закрыть файл.

   #include  int main () {int temp;  int count = 0;  ФАЙЛ * file = fopen ("file1.txt", "r");  if (file == NULL) {printf ("Не удалось открыть указанный файл");  возврат -1;  } while (fscanf (file, "% d", & temp) == 1) {count ++;  } fclose (файл);  printf ("% d", количество);  } return 0;}  

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

  #include  int main () {int temp  ;  int count = 0;  ФАЙЛ * file = fopen ("file1.txt", "r");  if (file == NULL) {printf ("Не удалось открыть указанный файл");  возврат -1;  } while (fscanf (file, "% d", & temp) == 1) {count ++;  } printf ("% d", количество);  if (count == 0) {//не создавать массив размером 0 fclose (file);  } else {//второй запуск int array [count];  перемотка (файл);  for (int i = 0; i  

4


  int array [0];   

и

fscanf(file,"%d",&array[count sizes) 

приведет к ошибке сегментации, потому что вы обращаетесь к массиву за пределами границ.

Если вам нужен гибкий массив, вам понадобится

  • int * array
  • заполнитель для хранения каждого числа из fscanf
  • realloc массив каждый раз, когда вы находите новое число и добавляете его в массив.

   #include  #define isDigit (c) ('0'  

5

Оцените статью
clickpad.ru
Добавить комментарий