Текстовый файл с вещественными числами сравнить с числами массива - C (СИ)
Формулировка задачи:
Решение задачи: «Текстовый файл с вещественными числами сравнить с числами массива»
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #define EPS (1.0e-6)
- typedef struct SET {
- double value;
- struct SET * next;
- } node_t, *set_t;
- int set_add(set_t * pSet, const double value) {
- if ( *pSet ) {
- if ( fabs((*pSet)->value - value) < EPS )
- return 0;
- return set_add(&((*pSet)->next), value);
- }
- else {
- if ( ! ( *pSet = malloc(sizeof(node_t)) ) )
- return -1;
- (*pSet)->value = value;
- (*pSet)->next = NULL;
- return 0;
- }
- }
- int set_dump(set_t set, FILE * fout) {
- while ( set ) {
- if ( fprintf(fout, "%f\n", set->value) < 0 )
- return -1;
- set = set->next;
- }
- return 0;
- }
- void set_free(set_t * pSet) {
- if ( *pSet ) {
- set_free(&((*pSet)->next));
- free(*pSet);
- *pSet = NULL;
- }
- }
- #define PROGRAM_NAME argv[0]
- #define INPUT_FILE_NAME argv[1]
- #define OUTPUT_FILE_NAME argv[2]
- int main(int argc, char ** argv) {
- FILE * fin, * fout;
- double value;
- set_t set = NULL;
- if ( argc < 3 ) {
- fprintf(stderr, "USAGE: %s <input_file> <output_file>\n", PROGRAM_NAME);
- exit(EXIT_FAILURE);
- }
- if ( ! ( fin = fopen(INPUT_FILE_NAME, "r") ) ) {
- fprintf(stderr, "%s: can't open file %s for input!\n", PROGRAM_NAME, INPUT_FILE_NAME);
- exit(EXIT_FAILURE);
- }
- while ( fscanf(fin, "%lf", &value) == 1 ) {
- if ( set_add(&set, value) ) {
- fprintf(stderr, "%s: memory error!\n", PROGRAM_NAME);
- fclose(fin);
- exit(EXIT_FAILURE);
- }
- }
- if ( ferror(fin) || fclose(fin) ) {
- fprintf(stderr, "%s: error while read input file!\n", PROGRAM_NAME);
- set_free(&set);
- exit(EXIT_FAILURE);
- }
- if ( ! ( fout = fopen(OUTPUT_FILE_NAME, "w") ) ) {
- fprintf(stderr, "%s: can't open file %s for output!\n", PROGRAM_NAME, OUTPUT_FILE_NAME);
- set_free(&set);
- exit(EXIT_FAILURE);
- }
- if ( set_dump(set, fout) ) {
- fprintf(stderr, "%s: error while write to output file!\n", PROGRAM_NAME);
- set_free(&set);
- if ( fclose(fout) )
- fprintf(stderr, "%s: can't properly close output file!\n", PROGRAM_NAME);
- exit(EXIT_FAILURE);
- }
- set_free(&set);
- if ( fclose(fout) ) {
- fprintf(stderr, "%s: can't properly close output file!\n", PROGRAM_NAME);
- exit(EXIT_FAILURE);
- }
- exit(EXIT_SUCCESS);
- }
Объяснение кода листинга программы
Код представляет собой программу, которая читает вещественные числа из текстового файла и добавляет их в связанный список. Затем программа записывает содержимое списка в другой файл. Если во время чтения или записи возникают ошибки, программа выводит сообщение об ошибке и завершает работу с неудачным статусом.
Список содержит элементы типа node_t
, которые представляют собой структуры, состоящие из одного вещественного числа и указателя на следующий элемент списка.
Список реализован с помощью динамической памяти, что означает, что его размер может изменяться во время выполнения программы.
В начале кода определены макросы для удобного доступа к аргументам командной строки.
Программа принимает три аргумента: имя входного файла, имя выходного файла и имя программы.
В функции main
открывается входной файл для чтения и выходной файл для записи.
Затем программа читает вещественные числа из входного файла и добавляет их в список с помощью функции set_add
.
Когда достигается конец входного файла, программа закрывает его и открывает выходной файл для записи.
Затем программа записывает содержимое списка в выходной файл с помощью функции set_dump
.
После завершения записи программа закрывает выходной файл и завершает работу с успешным статусом.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д