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