Скопировать строки из одного текстового файла в другой, расположив их в нем в порядке уменьшения длины - C (СИ)
Формулировка задачи:
Всем привет! Помогите мне с решением данной задачи! Мне уже через 4.5 часа ее нужно будет сдавать, а я не могу доделать ее.
В нем конечно есть ошибки, но это мне пока что побоку.
Вот что мне нужно доделать
Пытался уже всяко, но в голову ничего не лезет.
Задача
Скопировать строки из одного текстового файла в другой, расположив их в нем в порядке уменьшения длины. Вот код программы#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> int main(){ FILE *source, *result; char answer, symbol, *counter; char** buf; unsigned strcounter=0, i=0; int len[50]; puts("Welcome to the program to sort the rows base using file.\nTranslation produced by http://translation.google.ru/"); puts("Search for the file \"source.txt\"...");//Ïîèñê ГґГ*éëГ* source.txt source=fopen("source.txt","rt"); if(source!=NULL){ puts("File is found.");//Г”Г*éë Г*Г*éäåГ* puts("Delete the file (y\\n)?");//ÓäГ*ëèòü ГґГ*éë? do{ answer=getch(); switch(answer){ case 'y': fclose(source); if(!remove("source.txt")) { puts("File successfully deleted. The program is closed!");//Г”Г*éë ГіГ±ГЇГҐГёГ*Г® ГіГ¤Г*ëåГ* getch(); return 0; } else { puts("An error has occurred! The program is closed!");//ÏðîèçîøëГ* îøèáêГ*! ÏðîãðГ*ììГ* Г§Г*êðûâГ*ГҐГІГ±Гї! return(-1); } break; case 'n': break; default: puts("Wrong answer"); answer=0; break; //ГЌГҐГЇГ°Г*âèëüГ*ûé îòâåò } }while(answer==0); } else{ puts("File not found.");//Г”Г*éë Г*ГҐ Г*Г*éäåГ* puts("It creates the file...");//ÑîçäГ*ГҐГІГ±Гї ГґГ*éë... source=fopen("source.txt","wt"); if(source!=NULL){ puts("File successfully created!");//Г”Г*éë ГіГ±ГЇГҐГёГ*Г® ñîçäГ*Г*! fclose(source); puts("Write in the file \"source.txt\". The program is closed!"); getch(); return(0); } else{ puts("Error creating file!"); return(-2);}//ГЋГёГЁГЎГЄГ* ñîçäГ*Г*ГЁГї ГґГ*éëГ*! } //-------Ïîäñ÷èòûâГ*ГҐГ¬ ñòðîêè Гў ГґГ*éëå-------------------------------------------- while(!feof(source)){//Г–ГЁГЄГ« ïîâòîðÿåòñÿ äî òîãî, ïîêГ* Г*ГҐ äîéäåò äî ГЄГ®Г*Г¶Г* ГґГ*éëГ* symbol=fgetc(source); if(symbol=='\n' || symbol==EOF) strcounter++; else i++; } printf("%d|||%d",strcounter,i); // counter=(char *)malloc(i*sizeof(char)); buf=(char **)malloc(strcounter*sizeof(char));//ÂûäåëåГ*ГЁГҐ ГЇГ*ìÿòè äëÿ äâóìåðГ*îãî äèГ*Г*ìè÷åñêîãî Г¬Г*Г±Г±ГЁГўГ* for(i=0;i<strcounter;i++){ buf[i]=(char *)malloc(50*sizeof(char)); } i=0; int j=0; while(!foef(source)){//Г‡Г*ГЇГЁГ±Гј ñòðîê Гў Г¬Г*Г±Г±ГЁГў buf[i][j]=fgetc(source); if(buf[i][j]=='/n') j++; } for(i=0;i<strcounter;i++){ len[i]=strlen(buf[i]); } printf("%d",len); getch(); free(counter); free(strcounter); return 0; }
//-------Ïîäñ÷èòûâГ*ГҐГ¬ ñòðîêè Гў ГґГ*éëå-------------------------------------------- while(!feof(source)){//Г–ГЁГЄГ« ïîâòîðÿåòñÿ äî òîãî, ïîêГ* Г*ГҐ äîéäåò äî ГЄГ®Г*Г¶Г* ГґГ*éëГ* symbol=fgetc(source); if(symbol=='\n' || symbol==EOF) strcounter++; else i++; } printf("%d|||%d",strcounter,i); // counter=(char *)malloc(i*sizeof(char)); buf=(char **)malloc(strcounter*sizeof(char));//ÂûäåëåГ*ГЁГҐ ГЇГ*ìÿòè äëÿ äâóìåðГ*îãî äèГ*Г*ìè÷åñêîãî Г¬Г*Г±Г±ГЁГўГ* for(i=0;i<strcounter;i++){ buf[i]=(char *)malloc(50*sizeof(char)); } i=0; int j=0; while(!foef(source)){//Г‡Г*ГЇГЁГ±Гј ñòðîê Гў Г¬Г*Г±Г±ГЁГў buf[i][j]=fgetc(source); if(buf[i][j]=='/n') j++; } for(i=0;i<strcounter;i++){ len[i]=strlen(buf[i]); } printf("%d",len); getch(); free(counter); free(strcounter); return 0;
Чуть не забыл. Использовать только динамические массивы. У меня там конечно есть статические, но это я сделал временно
Решение задачи: «Скопировать строки из одного текстового файла в другой, расположив их в нем в порядке уменьшения длины»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> typedef struct line_t { char* pstr; size_t length; } TLine; //----------------------------------------------------------------------------- // Функция открытия файла, в случае ошибки программа завершается FILE* FileOpen(const char* fname, const char* params) { FILE* f = fopen(fname, params); if (f == NULL) { perror(fname); system("pause"); exit(EXIT_FAILURE); } return f; } //----------------------------------------------------------------------------- // Функция загружает в память данные из файла char* GetTextFromFile(const char* fname) { FILE* f = FileOpen(fname, "r"); fseek(f, 0, SEEK_END); size_t size = ftell(f); fseek(f, 0, SEEK_SET); char* text = (char*) malloc(size + 1); text[size] = 0; fread(text, size, 1, f); fclose(f); return text; } //----------------------------------------------------------------------------- // Функция подсчитывает количество строк в тексте size_t GetCountLine(const char* text) { size_t count = 1; for (; *text; ++text) { if (*text == '\n') { count++; } } return count; } //----------------------------------------------------------------------------- // Функция загружает информацию о строках size_t GetListLines(char* text, TLine** lines) { size_t count = GetCountLine(text); *lines = (TLine*) malloc(sizeof(TLine) * count); size_t i; for (i = 0; i < count; ++i) { (*lines)[i].pstr = text; (*lines)[i].length = 0; while (*text && (*text++ != '\n')) { (*lines)[i].length++; } } return count; } //----------------------------------------------------------------------------- // Функция сортировки для qsort int SortFunction(const void *a, const void *b) { return (((TLine*)a)->length - ((TLine*)b)->length); } //----------------------------------------------------------------------------- // Функция выгружает данные в файл void LinesToFile(const char* fname, const TLine* lines, size_t count) { FILE* f = fopen(fname, "w"); size_t i; for (i = 0; i < count; ++i) { fprintf(f, "%.*s\n", lines[i].length, lines[i].pstr); } fclose(f); } //----------------------------------------------------------------------------- int main() { char* text = GetTextFromFile("program.c"); TLine* lines = NULL; size_t count = GetListLines(text, &lines); qsort(lines, count, sizeof(TLine), SortFunction); LinesToFile("result.txt", lines, count); free(lines); free(text); system("pause"); return EXIT_SUCCESS; }
Объяснение кода листинга программы
В данном коде реализована программа для копирования строк из одного текстового файла в другой, расположив их в нём в порядке уменьшения длины. Список функций:
- FileOpen - функция открытия файла с установленным режимом чтения, в случае ошибки программа завершается.
- GetTextFromFile - функция, которая загружает в память данные из файла.
- GetCountLine - функция подсчитывает количество строк в тексте.
- GetListLines - функция загружает информацию о строках.
- SortFunction - функция сортировки для qsort.
- LinesToFile - функция выгружает данные в файл. Описание основной функции:
- В функции main создаётся указатель на строку text, который инициализируется значением, полученным из функции GetTextFromFile.
- Выделяется память под массив строк lines с помощью оператора malloc.
- В цикле производится заполнение массива lines с помощью функции GetListLines.
- С помощью функции qsort производится сортировка массива строк lines по их длине.
- В цикле с помощью функции LinesToFile производится запись отсортированных строк в файл result.txt.
- Выполняется освобождение памяти, выделенной под массив строк lines и указатель на строку text.
- Запускается функция system, которая ожидает нажатия клавиши.
- Программа завершается с кодом успеха.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д