Показать сообщение отдельно

  #7  
Старый 14.05.2010, 15:03
nitx
Участник форума
Регистрация: 04.01.2008
Сообщений: 186
С нами: 9658021

Репутация: 72
По умолчанию

Цитата:
пипл, помогите плиз на си накодить следующую штуку
Отсортировать строки файла сначала по длине, а затем строки равной длины в алфавитном порядке, результат вывести в файл
fsort.h:
Код:
#ifndef FSORT
#define FSORT
 
#define BUFFSIZE 8
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct s_fstring FString;
struct s_fstring {
    char * str;
    size_t count;
    FString * next;
};
 
#endif
main.c:
Код:
#include "fsort.h"
         
FString * readInput(FILE * infile, FString * head) {
    int i,k = 0;
    char buff[BUFFSIZE];
    int count = 0;
    FString * ptr = NULL;
    head = (FString*)malloc(sizeof(FString));
    ptr = head;
    ptr->str = (char*)malloc(BUFFSIZE+1);
    ptr->count = 0;
    while((count = fread(buff, sizeof(char), BUFFSIZE, infile))) {
        for(i = 0; i < count; i++) {
            if(buff[i] == '\n') {
                ptr->str[k] = '\0';
                ptr->next = (FString*)malloc(sizeof(FString));
                ptr = ptr->next;
                ptr->str = (char*)malloc(BUFFSIZE+1);
                ptr->count = 0;
                ptr->next = NULL;
                k = 0;
            }
            else {
                if(k == BUFFSIZE+1)
                    ptr->str = (char*)realloc(ptr->str, k+BUFFSIZE);
                ptr->str[k++] = buff[i];
                ptr->count++;
            }
        }
    }    
    ptr->str[k] = '\0';
    return head;
}        
         
void fsort(FString * head) {
    int i = 1;
    size_t tmp = 0;
    char * stmp;
    FString * ptr = head;
    FString * foo = NULL;
    while(i == 1) {
        i = 0;
        for(ptr = head; ptr != NULL; ptr = ptr->next)
            if(ptr->next != NULL) {
                foo = ptr->next;
                if(ptr->count > foo->count) {
                    tmp = ptr->count;
                    ptr->count = foo->count;
                    foo->count = tmp;
                    stmp = ptr->str;
                    ptr->str = foo->str;
                    foo->str = stmp;
                    i = 1;
                }
                else if(ptr->count == foo->count)
                    if(strcmp(foo->str, ptr->str) < 0) {
                        stmp = ptr->str;
                        ptr->str = foo->str;
                        foo->str = stmp;
                        i = 1;
                    }
            }
    }    
}        
         
void strWrite(FILE * outfile, FString * head) {
    FString * ptr = NULL;
    size_t size = 0;
    for(ptr = head; ptr != NULL; ptr = ptr->next)
        if(ptr->str[0] != 0) {
            size = fwrite(ptr->str, sizeof(char), ptr->count, outfile);
            fputc('\n', outfile);
            if(size != ptr->count)
                printf("Error whilre writing to file.\n");
                printf("Error whilre writing to file.\n");
        }
}       
        
int main(const int argc, const char * argv[]) {
    FILE * infile = NULL;
    FILE * outfile = NULL;
    FString * head = NULL;
    FString * tmp = NULL;
    if(argc < 2) {
        printf("Input filename is not specified.\n");
        return 1;
    }   
    else if(argc < 3) {
        printf("Output filename is not specified.\n");
        return 1;
    }   
    infile = fopen(argv[1], "r");
    outfile = fopen(argv[2], "w");
    if(infile == NULL) {
        printf("Error while reading %s file.\n", argv[1]);
        return 2;
    }   
    if(outfile == NULL) {
        printf("Error while opening %s file.\n", argv[2]);
        return 2;
    }   
    tmp = readInput(infile, head);
    fsort(tmp);
    strWrite(outfile, tmp);
    fclose(infile);
    fclose(outfile);
    return 0;
}
fsort() - делает сортировку пузырьком.
Имя входного\выходного файла задаются через аргументы при запуске.
Возможны баги, а так же код не идеален .
Сравнение строк по алфавиту сделано через функцию strcmp, не надо придумывать велоспедов.
 
Ответить с цитированием