Текстовый файл с вещественными числами сравнить с числами массива - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Добрый день! Огромная просьба помочь с программой. Дан текстовый файл с вещественными числами. Числа необходимо сравнивать с другими числами из массива. При совпадении числа вычеркивать (не писать в новый файл). Не получается сохранить структуру исходного файла (она не простая) при записи в новый файл. Читаю из файла fscanf(.....,"%f","%f", &a, &b); Читается правильно. Сравнение получается. Если читать строками, то не удается вычеркнуть нужное число при записи в новый файл. Сравнение д.б. с вещественным числом. Очень прошу о помощи, и заранее спасибо.

Решение задачи: «Текстовый файл с вещественными числами сравнить с числами массива»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. #define EPS (1.0e-6)
  6.  
  7. typedef struct SET {
  8.     double value;
  9.     struct SET * next;
  10. } node_t, *set_t;
  11.  
  12. int set_add(set_t * pSet, const double value) {
  13.     if ( *pSet ) {
  14.         if ( fabs((*pSet)->value - value) < EPS )
  15.             return 0;
  16.         return set_add(&((*pSet)->next), value);
  17.     }
  18.     else {
  19.         if ( ! ( *pSet = malloc(sizeof(node_t)) ) )
  20.             return -1;
  21.         (*pSet)->value = value;
  22.         (*pSet)->next = NULL;
  23.         return 0;
  24.     }
  25. }
  26.  
  27. int set_dump(set_t set, FILE * fout) {
  28.     while ( set ) {
  29.         if ( fprintf(fout, "%f\n", set->value) < 0 )
  30.             return -1;
  31.         set = set->next;
  32.     }
  33.    
  34.     return 0;
  35. }
  36.  
  37. void set_free(set_t * pSet) {
  38.     if ( *pSet ) {
  39.         set_free(&((*pSet)->next));
  40.         free(*pSet);
  41.         *pSet = NULL;
  42.     }
  43. }
  44.  
  45. #define PROGRAM_NAME argv[0]
  46. #define INPUT_FILE_NAME argv[1]
  47. #define OUTPUT_FILE_NAME argv[2]
  48.  
  49. int main(int argc, char ** argv) {
  50.     FILE * fin, * fout;
  51.     double value;
  52.     set_t set = NULL;
  53.    
  54.     if ( argc < 3 ) {
  55.         fprintf(stderr, "USAGE: %s <input_file> <output_file>\n", PROGRAM_NAME);
  56.         exit(EXIT_FAILURE);
  57.     }
  58.    
  59.     if ( ! ( fin = fopen(INPUT_FILE_NAME, "r") ) ) {
  60.         fprintf(stderr, "%s: can't open file %s for input!\n", PROGRAM_NAME, INPUT_FILE_NAME);
  61.         exit(EXIT_FAILURE);
  62.     }
  63.    
  64.     while ( fscanf(fin, "%lf", &value) == 1 ) {
  65.         if ( set_add(&set, value) ) {
  66.             fprintf(stderr, "%s: memory error!\n", PROGRAM_NAME);
  67.             fclose(fin);
  68.             exit(EXIT_FAILURE);
  69.         }
  70.     }
  71.    
  72.     if ( ferror(fin) || fclose(fin) ) {
  73.         fprintf(stderr, "%s: error while read input file!\n", PROGRAM_NAME);
  74.         set_free(&set);
  75.         exit(EXIT_FAILURE);
  76.     }
  77.    
  78.     if ( ! ( fout = fopen(OUTPUT_FILE_NAME, "w") ) ) {
  79.         fprintf(stderr, "%s: can't open file %s for output!\n", PROGRAM_NAME, OUTPUT_FILE_NAME);
  80.         set_free(&set);
  81.         exit(EXIT_FAILURE);
  82.     }
  83.    
  84.     if ( set_dump(set, fout) ) {
  85.         fprintf(stderr, "%s: error while write to output file!\n", PROGRAM_NAME);
  86.         set_free(&set);
  87.         if ( fclose(fout) )
  88.             fprintf(stderr, "%s: can't properly close output file!\n", PROGRAM_NAME);
  89.         exit(EXIT_FAILURE);
  90.     }
  91.    
  92.     set_free(&set);
  93.    
  94.     if ( fclose(fout) ) {
  95.         fprintf(stderr, "%s: can't properly close output file!\n", PROGRAM_NAME);
  96.         exit(EXIT_FAILURE);
  97.     }
  98.    
  99.     exit(EXIT_SUCCESS);
  100. }

Объяснение кода листинга программы

Код представляет собой программу, которая читает вещественные числа из текстового файла и добавляет их в связанный список. Затем программа записывает содержимое списка в другой файл. Если во время чтения или записи возникают ошибки, программа выводит сообщение об ошибке и завершает работу с неудачным статусом. Список содержит элементы типа node_t, которые представляют собой структуры, состоящие из одного вещественного числа и указателя на следующий элемент списка. Список реализован с помощью динамической памяти, что означает, что его размер может изменяться во время выполнения программы. В начале кода определены макросы для удобного доступа к аргументам командной строки. Программа принимает три аргумента: имя входного файла, имя выходного файла и имя программы. В функции main открывается входной файл для чтения и выходной файл для записи. Затем программа читает вещественные числа из входного файла и добавляет их в список с помощью функции set_add. Когда достигается конец входного файла, программа закрывает его и открывает выходной файл для записи. Затем программа записывает содержимое списка в выходной файл с помощью функции set_dump. После завершения записи программа закрывает выходной файл и завершает работу с успешным статусом.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.375 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы