텍스트파일의 레코드들을 5개씩 끊어서 정렬 뒤 다른 파일에 옮기기
Orange
질문 제목 : 텍스트파일의 레코드들을 5개씩 끊어서 정렬 뒤 다른 파일에 옮기기 질문합니다.질문 요약 :텍스트파이릐 레코드들을 5개단위로 끊어서 메모리에서 내부정렬(이를테면 버블소트)를 하고 그걸 다시 다른 새로운 텍스트파일에 옮겨담는 코딩 질문드립니다..
질문 내용 : 텍스트파일에는 학번(정수4자리)/이름(한글3글자)/나이(정수2자리)/본적(한글2글자)/성별(한글1글자) 의 고정길이로 총 52개의 레코드가 담겨있습니다. 그런데 이 텍스트파일을 열어서 레코드를 5개씩 끊어서 내부정렬(버블소트나 삽입소트)를 거쳐서 학번오름차순으로 정렬한뒤 다시 새로운 텍스트파일에 그걸 옮겨 담습니다.. 예를 들면 5555 4444 2222 5873 1111 9952 2547 1265 9999 2333 이렇게기존파일에 저장이 되어있었다면 결과적으로 새로운 파일에는 1111 2222 4444 5555 5873 1265 2333 2547 9952 9999 로 정렬이 되는 저장되는겁니다.. 제가 나름대로 머리를 짜내서 아래와 같이 써봤는데.. 새로운 텍스트파일에 52개가 아니고 55개가 정렬되어 파일에 저장되네요;; 그리고 마지막 잘못 저장된 3개의 레코드는 이미 나온 레코드가 3개가 복사되어진거더군요....;; 아래에 코딩을 첨부하니..뭐가 잘못된건지.. 또 어떻게 하면 문제가 해결되는지 알려주세요~
#include stdio.h
#include string.h
#include stdlib.h
#define INVALID -1; //비유효값정의
#define REC record.txt
#define RUNREC run_record.txt
#define MAX 52 //초기 데이터 레코드의 개수
#define RUNMAX 5 //RUN에 최대 들어가는 데이터의 개수
//구조체 정의
typedef struct record {
int id;
char n[7];
int age;
char addr[5];
char s[3];
short int v;
}record;
//함수 선언
void Print_Record();
void Run_Generation();
void Print_Run();
void Fourway_Merge();
void BubbleSort();
void Swap(record*,record*);
/*====보조 함수들====*/
void BubbleSort(record *list,int c)
{
int i,j;
for(i=0; ic; i++)
{
for(j=1;jc-i;j++)
{
if(list[j-1].id list[j].id)
{
Swap(&list[j],&list[j-1]);
}
}
}
}
void Swap(record *a,record *b)
{
record temp;
temp.id = a-id;
strcpy(temp.n,a-n);
temp.age = a-age;
strcpy(temp.addr,a-addr);
strcpy(temp.s,a-s);
a-id = b-id;
strcpy(a-n,b-n);
a-age = b-age;
strcpy(a-addr,b-addr);
strcpy(a-s,b-s);
b-id = temp.id;
strcpy(b-n,temp.n);
b-age = temp.age;
strcpy(b-addr,temp.addr);
strcpy(b-s,temp.s);
}
/*====주요 함수들====*/
//데이터 생성 함수
void Data_Generation(record *Ori_rec,FILE *fp)
{
int i=0;
while(!feof(fp))
{
fscanf(fp,%d %s %d %s %s,&Ori_rec[i].id, Ori_rec[i].n, &Ori_rec[i].age, Ori_rec[i].addr, Ori_rec[i].s);
i++;
}
}
//초기 레코드 출력 함수
void Print_Record()
{
FILE *fp;
record Ori_rec[MAX];
int i=0;
fp = fopen(REC,r);
Data_Generation(Ori_rec,fp);
while(iMAX)
{
printf(%d %s %d %s %s\n,Ori_rec[i].id,Ori_rec[i].n,Ori_rec[i].age,Ori_rec[i].addr,Ori_rec[i].s);
i++;
}
fclose(fp);
}
//run 생성하는 함수
//문제의 그 함수부분.. 이부분이 문젠데 고수분들 뭐가 잘못된건지.. 해결책은 뭔지.. 어떻게 해야 깔끔한건지 가르쳐주세요
void Run_Generation()
{
FILE *fp;
FILE *rfp;
record Ori_rec[MAX];
record Run_rec[RUNMAX];
int i=0,k=0;
fp = fopen(REC,r);
rfp = fopen(RUNREC,w+);
while(!feof(fp))
{
for(i=0;iRUNMAX;i++)
{
fscanf(fp,%d %s %d %s %s,&Run_rec[i].id, Run_rec[i].n, &Run_rec[i].age, Run_rec[i].addr, Run_rec[i].s);
}
BubbleSort(Run_rec,RUNMAX);
for(i=0;iRUNMAX;i++)
{
fprintf(rfp,%d %s %d %s %s\n,Run_rec[i].id, Run_rec[i].n, Run_rec[i].age, Run_rec[i].addr, Run_rec[i].s);
}
}
}
//main 함수
int main()
{
printf(=====Print Record=====\n);
Print_Record(); //데이터 화일 초기 레코드를 출력하는 함수
printf(=======Print Run======\n);
Run_Generation(); //run 생성하는 함수
return 0;
}
번호 | 제 목 | 글쓴이 | 날짜 |
---|---|---|---|
2692282 | 도스상에서 생성된 exe파일에 press~ 뜨게 하기 (4) | 회사원 | 2025-04-21 |
2692256 | scanf("%*c"); ㅠㅠ 고수님들 | 거북이 | 2025-04-21 |
2692230 | 하노이탑 질문입니다. (1) | 미쁘다 | 2025-04-21 |
2692210 | 정보 올림피아드 문제인데.. 풀이 과정이 궁금합니다.(재귀함수) (5) | 물티슈 | 2025-04-20 |
2692144 | C언어와 리눅스에 대한 질문입니다. | 싴흐한세여니 | 2025-04-20 |
2692114 | 컨텍스트 스위칭하는데 걸리는 시간 측정.. | YourWay | 2025-04-19 |
2692086 | 간접참조 연산자, 증감연산자 질문이용! (2) | 블랙캣 | 2025-04-19 |
2692056 | 주석좀 달아주세요. 몇개적엇는데 몇개만달아주세요. (2) | DevilsTears | 2025-04-19 |
2691978 | 진수 쉽게 이해하는법... (3) | 지지않는 | 2025-04-18 |
2691949 | getchar() 한 문자를 입력받는 함수 질문 | 채꽃 | 2025-04-18 |
2691919 | 배열 정렬 및 합치기 질문입니다. | 사과 | 2025-04-18 |
2691845 | c언어왕초보 질문이 있습니다........ | 루나 | 2025-04-17 |
2691815 | void add(int num); 함수... (4) | 살랑살랑 | 2025-04-17 |
2691756 | 명령 프롬프트 스크롤바가 없어요 | 두메꽃 | 2025-04-16 |
2691725 | 자료구조에 관련해서 질문이 있어 글을 올립니다. | 누리알찬 | 2025-04-16 |
2691697 | if 문에서 구조체 배열에 저장되있던 문자열 검사하는 법 ? (2) | 민트맛사탕 | 2025-04-16 |
2691678 | C언어 함수 질문이요~!!! | 연보라 | 2025-04-15 |
2691650 | 반복문 | 돋가이 | 2025-04-15 |
2691618 | 링크드리스트 개념 질문이예요 (3) | 맨마루 | 2025-04-15 |
2691592 | 동적할당 이용 배열선언 질문입니다.ㅠㅠ (3) | 허리달 | 2025-04-15 |