Выдается ошибка 'fcloseall' undeclared - C (СИ)
Формулировка задачи:
Для проработки лаб со мной знакомый , после того как попросила помочь,так сказать "поделился" кодом.
А у меня он чего-то не хочет запускаться, выдает одну единственную ошибку
In function `int main()':
`fcloseall' undeclared (first use this function)
(Each undeclared identifier is reported only once for each function it appears in.)
Это какой-то библиотеки не хватает в коде или что раз `fcloseall' необьявленый?????
Работаю в Dev-c++
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- struct sym //структуры или записи
- {
- unsigned char ch;
- float freq;
- char code[255];
- sym *left;
- sym *right;
- };
- union code
- {
- unsigned char chhh;//переменная содержащая код для записи в сжатый файл
- struct byte
- {
- unsigned b1:1;
- unsigned b2:1;
- unsigned b3:1;
- unsigned b4:1;
- unsigned b5:1;
- unsigned b6:1;
- unsigned b7:1;
- unsigned b8:1;
- }byte;
- };
- sym *makeTree(sym *psym[],int k)//рeкурсивная функция создания дерева Хофмана
- {
- sym *temp;
- temp=(sym*)malloc(sizeof(sym));
- temp->freq=psym[k-1]->freq+psym[k-2]->freq;
- temp->code[0]=0;
- temp->left=psym[k-1];
- temp->right=psym[k-2];
- if(k==2)
- return temp;
- else //внесение в массив в нужное место элемента дерева Хофмана
- {
- for(int i=0;i<k;i++)
- if (temp->freq>psym[i]->freq)
- {
- for(int j=k-1;j>i;j--)
- psym[j]=psym[j-1];
- psym[i]=temp;
- break;
- }
- }
- return makeTree(psym,k-1);
- }
- void makeCodes(sym *root)//Рекурсивная функция кодирования
- {
- if(root->left)
- {
- strcpy(root->left->code,root->code);
- strcat(root->left->code,"0");
- makeCodes(root->left);
- }
- if(root->right)
- {
- strcpy(root->right->code,root->code);
- strcat(root->right->code,"1");
- makeCodes(root->right);
- }
- }
- int main ()
- {
- FILE *fp,*fp2,*fp3; //указатели на файлы
- //fp=fopen("777.txt","rb"); //открываем конкретный файл для сжатия
- fp=fopen("123.txt","rb"); //открываем конкретный файл
- fp2=fopen("teemp.txt","wb");//открываем файл для записи бинарного кода
- fp3=fopen("7777.txt","wb");//открываем файл для записи сжатого файла
- int chh; // в эту переменную читается информация из файла
- int k=0; //счётчик количества различных букв, уникальных символов
- int kk=0; // счётчик количества всех знаков в файле
- int fsize2=0;//счётчик количества символов из 0 и 1 в промежуточном файле teemp
- int ts;//размер хвоста файла (то, что не кратно 8 в промежуточном файле)
- int kolvo[256]={0};//инициализируем массив количества уникальных символов
- sym simbols[256]={0}; //инициализируем массив записей
- sym *psym[256]; //инициализируем массив указателей на записи
- float summir=0;//сумма частот встреч
- int mes[8];//массив 0 и 1
- char j=0;//вспомогательная переменная
- //Обработка ошибок чтения файла
- if(fp==NULL)
- {
- puts("FILE NOT OPEN!!!!!!!");
- return 0;
- }
- sym *symbols=(sym*)malloc(k*sizeof(sym));//создание динамического массива структур simbols
- sym **psum=(sym**)malloc(k*sizeof(sym*));//создание динамического массива указателей на simbols
- //Начинаем побайтно читать файл и составлять таблицу встречаемости
- while((chh=fgetc(fp))!=EOF)
- {
- for(int j=0; j<256; j++)
- {
- if (chh==simbols[j].ch)
- {
- kolvo[j]++;
- kk++;
- break;
- }
- if (simbols[j].ch==0)
- {
- simbols[j].ch=(unsigned char)chh;
- kolvo[j]=1;
- k++; kk++;
- break;
- }
- }
- }
- // Рассчёт частоты встречаемости
- for(int i=0;i<k;i++)
- simbols[i].freq=(float)kolvo[i]/kk;
- for(int i=0;i<k;i++) //в массив указателей заносим адреса записей
- psym[i]=&simbols[i];
- //Сортировка по убыванию
- sym tempp;
- for(int i=1;i<k;i++)
- for(int j=0;j<k-1;j++)
- if(simbols[j].freq<simbols[j+1].freq)
- {
- tempp=simbols[j];
- simbols[j]=simbols[j+1];
- simbols[j+1]=tempp;
- }
- for(int i=0;i<k;i++)
- {
- summir+=simbols[i].freq;
- printf("Ch= %d\tFreq= %f\tPPP= %c\t\n",simbols[i].ch,simbols[i].freq,psym[i]->ch,i);
- }
- printf("\n Slova = %d\tSummir=%f\n",kk,summir);
- sym *root=makeTree(psym,k);//вызов функции создания дерева Хофмана
- makeCodes(root);//вызов функции получения кода
- rewind(fp);//возвращаем указатель в файле в начало файла
- //в цикле читаем исходный файл, и записываем полученные в функциях коды в промежуточный файл
- while((chh=fgetc(fp))!=EOF)
- {
- for(int i=0;i<k;i++)
- if(chh==simbols[i].ch)
- fputs(simbols[i].code,fp2);
- }
- fclose(fp2);
- //Заново открываем файл с бинарным кодом, но теперь для чтения
- int i=0;
- fp2=fopen("teemp.txt","rb");
- //Считаем размер бинарного файла(количество символов в нём)
- while((chh=fgetc(fp2))!=EOF)
- fsize2++;
- ts=fsize2%8;//находим остаток, количество символов не кратных 8 (хвост)
- //формируем заголовок сжатого файла через поля байтов
- fwrite("compresing!!!",sizeof(char),24,fp3);//условная подпись
- fwrite(&k,sizeof(int),1,fp3);//количество уникальных символов
- fwrite(&ts,sizeof(int),1,fp3);//величина хвоста
- //Записываем в сжатый файл таблицу встречаемости
- for(i=0;i<k;i++)
- {
- fwrite(&simbols[i].ch,sizeof(sym),1,fp3);
- fwrite(&simbols[i].freq,sizeof(sym),1,fp3);
- }
- rewind(fp2);//возвращаем указатель в промежуточном файле в начало файла
- union code code1;//инициализируем переменную code1
- //Читаем бинарный файл, занося последовательно каждые 8 элементов в массив для последующей побитовой обработки в объединении union
- j=0;
- for(int i=0;i<fsize2-ts;i++)
- {
- mes[j]=fgetc(fp2);
- if(j==7)
- {
- code1.byte.b1=mes[0]-'0';
- code1.byte.b2=mes[1]-'0';
- code1.byte.b3=mes[2]-'0';
- code1.byte.b4=mes[3]-'0';
- code1.byte.b5=mes[4]-'0';
- code1.byte.b6=mes[5]-'0';
- code1.byte.b7=mes[6]-'0';
- code1.byte.b8=mes[7]-'0';
- fputc(code1.chhh,fp3);
- j=0;
- }
- j++;
- }
- //Записываем хвост
- j=0;
- for(int i=0;i<=ts;i++)
- {
- mes[j]=fgetc(fp2);
- if(j==ts)
- {
- code1.byte.b1=mes[0]-'0';
- code1.byte.b2=mes[1]-'0';
- code1.byte.b3=mes[2]-'0';
- code1.byte.b4=mes[3]-'0';
- code1.byte.b5=mes[4]-'0';
- code1.byte.b6=mes[5]-'0';
- code1.byte.b7=mes[6]-'0';
- code1.byte.b8=mes[7]-'0';
- fputc(code1.chhh,fp3);
- }
- j++;
- }
- fcloseall();//закрываем все открытые файлы
- return 0;
- }
Решение задачи: «Выдается ошибка 'fcloseall' undeclared»
textual
Листинг программы
- #define _GNU_SOURCE
Объяснение кода листинга программы
- Подключается заголовочный файл
fcntl.h
для использования системных вызовов. - Включается заголовочный файл
unistd.h
для использования стандартных функций языка C. - Включается заголовочный файл
stdio.h
для использования функций ввода-вывода. - Включается заголовочный файл
stdlib.h
для использования функций работы с памятью. - Включается заголовочный файл
string.h
для использования функций работы со строками. - Определяется макрос
_GNU_SOURCE
для использования расширенных функций GNU. - Создается функция
main
с типом возвращаемого значенияint
. - Внутри функции
main
объявляются переменные:fd
как целочисленный файловый дескриптор.buffer
как указатель на буфер для чтения.path_name
как строка, содержащая путь к файлу.
- Устанавливается начальное значение регистрации библиотеки стандартного ввода/вывода.
- Открывается файл с помощью функции
fdopen
с указанием пути к файлу и режима чтения. - Проверяется успешность открытия файла с помощью условного оператора
if
. - Если файл успешно открыт, то в цикле с помощью функции
fscanf
считываются значения из файла и сохраняются в переменные:num
как целочисленное значение.str
как строковое значение.
- После завершения цикла выводится сообщение об успешном выполнении программы.
- Если файл не удалось открыть, то выводится сообщение об ошибке и возвращается значение
1
. - В конце функции
main
возвращается значение0
, указывающее на успешное выполнение программы. - Завершается определение функции
main
. - В конце файла подключается библиотека
stdlib.h
для использования функций работы с памятью. - В конце файла подключается библиотека
stdio.h
для использования функций ввода-вывода. - В конце файла подключается библиотека
fcntl.h
для использования системных вызовов. - В конце файла завершается программа.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д