2015-01-03 3 views
0

저는 응용 프로그램을 개발 중입니다. 함수 중 하나는 기본적으로 fp 파일의 책 이름을 사전 순으로 정렬 한 다음 fp2 파일로 인쇄하는 함수입니다. .
알파벳순으로 책 이름 정렬

이 기능은 파일 fp에서 파일 fp2로 책의 이름을 인쇄하는 것입니다.

알파벳 순서에 따라 도서 이름을 fp2 파일로 정렬하는 것이 가능한지 알고 싶습니다.

저는 C 초보자이고 C 프로그래밍에 많은 경험이 없습니다 ... 누군가 도움이됩니까?

#include <stdio.h>  
FILE *fp; 
FILE *fp2; 

struct book{ 
    int key; 
    char name[50]; 
    int price; 
}; 

sort_books_file(){ 

    struct book b; 

    //r: open the file for reading (read-only) 
    if ((fp=fopen("books.dat","r"))==NULL){ 
     printf("Error\n"); 
     exit(1); 
    } 

    //w: open the file for writing (write-only). 
    //the file is created if it doesn't exist 
    if ((fp2=fopen("books_sorted.dat","w"))==NULL){ 
     printf("Error: not possible to open the file. \n"); 
     exit(1); 
    } 

    //while end of file has not been reached 
    while (!feof(fp)){ 

     fread(&b,sizeof(b),1,fp); 

     if(feof(fp)) 
     { 
     break; 
     } 

     fwrite(&b.name,sizeof(b.name),1,fp2); 

    } 

    fclose(fp); 
    fclose(fp2); 
} 
+0

사용'을 strcmp()'당신'을 strcmp을 사용할 수 있습니다 – Gopi

+0

를 정렬하는()'또는'stricmp()'문자열을 비교,하지만 여전히 실제 정렬 알고리즘을 필요로합니다. 대부분의 초보자는 단순하기 때문에 버블 정렬을 사용하지만 실제 시나리오에서는 비효율적으로 비효율적입니다. 'books.dat'에 들어있는 샘플을 제공 할 수 있습니까? 줄 당 하나의 문자열입니까, 쉼표로 구분 된 값 (CSV) 파일입니까? – DevNull

+0

\ 00 \ 00 \ \ 00pfbiaegumcqgveplxkxt \ 00 \ B3i \ F6 \ DB \ 00 \ 00 \ 87 \ 00 \ 00 \ B9 00 \ 00 \ 00 \ 00 \ 00haaddflukpemtm \ 00lxkxt \ 00 \ B3i \ F6 \ DB \ \ 00 \ 00 \ ED \ 00 \ 00 \ DE \ 00 \ 00 \ 00 \ 00 \ 00qnhgcfraymewunyv \ 00kxt 00 \ B3i \ F6 \ DB \ \ 00 \ 00J \ 00 \ 00 \ 00 \ 00 \ 00 \ 00 \ 00anuedqtnbjqsyxbbfuc \ 00 \ 00 \ B3i \ F6 \ DB \ 00 \ 00 \ 93 \ 00 \ 00리터 \ 00 \ 00 \ 00 \ 00 \ 00fwebpjewkttqwkkmovdhvbk 00 \ DB \ 00 \ 00 \ 00 \ 00 \ 88 % \ \ 00 \ 00 \ 00 \ 00 \ 00mpkrwjwayg \ 00qwkkmovdhvbk \ 00 \ DB \ 00 \ 00b 인 \ 00 \ 00 \ 00 \ 00 \ 00 \ 00 \ 00qkaewns \ 00yg \ 00qwkkmovdhvbk 00 \ DB \ 00 \ 00 \ 00 \ 00 \ 81 \ 00 \ \ 00 \ 00 \ 00 \ 00ummduqsnbmkk \ 00kkmovdhvbk \ 00 \ DB \ 00 \ 00L \ 00 \ 00; CSV 제 생각에는 (책의 이름은 임의의 문자열입니다) – Zombie

답변

2

가장 쉬운 방법은 정렬 book.name에 STRCMP()를 사용하는 것입니다. 다음

STRCMP()는 작동 :

구문 : int strcmp(const char *str1, const char *str2)

ST1 및 STR2가

을 비교하는 문자열 STR1가 STR2 미만인 경우

기능은 -1 반환 문자열이 같으면 이고 str1이 str2보다 큰 경우 입니다.

strcmp()는 사전 식 순서를 사용합니다. 즉 사전에 나타나는대로 단어를 정렬합니다. Here's에 대한 질문이 나와 있습니다.

strcmp("hello", "world") -1을 반환

strcmp("world", "hello") 반환 한

stcmp("boo", "boo") 0을 반환

그리고 여기 당신이 원하는 않는 정렬 기능이다 (나는 그것을 테스트하지 않았습니다) :

void sort_books_file(){ 

//Assume you have only maximum 10 books 
struct book books[10]; 
strct book b; 

//open files for reading and writing 
//.. 
//.. 

int i = 0; 
while (!feof(fp)){ 

     fread(&b,sizeof(b),1,fp); 
     books[i] = b; 
     i++; 
     if(feof(fp)) 
     { 
     break; 
     } 
    } 

//number of books 
int len = i; 
//bubble sort; 
int j = 0; 

//Bubble sort. Google for "bubble sort" 
for(i=0; i<len; i++) 
{ 
    for(j=0; j<len-1; j++) 
    { 
     //If the first book should come after the next book in the array 
     if(strcmp(books[j].name, books[j+1].name) > 0) 
     { 
      //swap the books 
      struct book temp; 
      temp = books[j]; 
      books[j] = books[j+1]; 
      books[j+1] = temp; 
     } 
    } 
} 

//now write each book in the array "books" into the file one by one 
} 
+0

코드를 작성하여 코드를 완성했지만 책 이름이 삽입 된 것과 같은 방식으로 책의 이름이 인쇄되었습니다. // 이제 각 책을 배열 "books"에 하나씩 파일에 씁니다. \t int z; 위한 \t (Z = 0; Z Zombie

+0

는 그런 일이 정렬 잘못 갔다. 은 if 조건 내에서의 printf를 사용하고 난 상태와 스왑가 작동하지 않는 경우 내부의 printf를 사용하여 필요한 곳에 – lonesword

+0

책은 참으로 교체되었는지 확인. 주문은 삽입 된 것과 동일하게 유지됩니다. – Zombie

2

나는이 도움이되기를 바랍니다 :

void sort(struct book* books, int n) 
{ 
    int j,i; 

    for(i=1;i<n;i++) 
    { 
     for(j=0;j<n-i;j++) 
     { 
      if(books[j].name < books[j+1].name) 
      { 
       struct book temp = books[j]; 
       books[j] = books[j+1]; 
       books[j+1] = temp; 
      } 
     } 
    } 
} 

스토어 도서 정보를 구조의 배열로. 그런 다음이 배열을 정렬 함수에 전달하십시오. 이것은 당신의 일을 할 것입니다.

struct book LIST[n]; 
sort(LIST, n);