Скопировать строки из одного текстового файла в другой, расположив их в нем в порядке уменьшения длины - 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;
}

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

В данном коде реализована программа для копирования строк из одного текстового файла в другой, расположив их в нём в порядке уменьшения длины. Список функций:

  1. FileOpen - функция открытия файла с установленным режимом чтения, в случае ошибки программа завершается.
  2. GetTextFromFile - функция, которая загружает в память данные из файла.
  3. GetCountLine - функция подсчитывает количество строк в тексте.
  4. GetListLines - функция загружает информацию о строках.
  5. SortFunction - функция сортировки для qsort.
  6. LinesToFile - функция выгружает данные в файл. Описание основной функции:
  7. В функции main создаётся указатель на строку text, который инициализируется значением, полученным из функции GetTextFromFile.
  8. Выделяется память под массив строк lines с помощью оператора malloc.
  9. В цикле производится заполнение массива lines с помощью функции GetListLines.
  10. С помощью функции qsort производится сортировка массива строк lines по их длине.
  11. В цикле с помощью функции LinesToFile производится запись отсортированных строк в файл result.txt.
  12. Выполняется освобождение памяти, выделенной под массив строк lines и указатель на строку text.
  13. Запускается функция system, которая ожидает нажатия клавиши.
  14. Программа завершается с кодом успеха.

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


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

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

15   голосов , оценка 3.933 из 5
Похожие ответы