안녕하세요 리눅스 C프로그래밍 질문좀 부탁드립니다
  안녕하세요 과제하고있는 평범한 컴공생인데 도저히 난관이 풀리질않아서 구글링하다가 들러본 여기에 올려봅니다..
내용은 파일 레코드를 정렬 및 출력하는기능인데요.
stdb2 에 학번, 이름 , 점수 순으로 파일에 입력되어있는상태입니다
예)  이름 : Paek8 , 학번 : 1401161 , 점수 : 62
 이름 : Lee13 , 학번 : 1401164 , 점수 : 58
 이름 : Kim14 , 학번 : 1401165 , 점수 : 47
 이름 : Park8 , 학번 : 1401168 , 점수 : 63
 이름 : Cho6 , 학번 : 1401171 , 점수 : 44
 이름 : You3 , 학번 : 1401174 , 점수 : 57
 이름 : Jeong9 , 학번 : 1401177 , 점수 : 64
 이름 : Yoon7 , 학번 : 1401180 , 점수 : 65
 이름 : Lee14 , 학번 : 1401183 , 점수 : 59
이런식으로요.
총 100개가있구요. 그런데 이걸 전부 출력하는 함수 dblist.c 를 작성하고 실행하는 과정에서 뭔가 이상하게 실행됩니다.
이름 : Paek1 , 학번 : 1401001 , 점수 : 80
 이름 :
1401006 Kim1 54
1401009 Park1 6▒>Ʉ , 학번 : 542138738 , 점수 : 1798381622
 이름 : Lee1 , 학번 : 1401003 , 점수 : 75
 이름 : 6
1401015 Lee2 73
1401016 Jeong1▒>Ʉ , 학번 : 908085861 , 점수 : 1869506353
 이름 :  87
1401019 Kang1 72
1401020 Yoo▒>Ʉ , 학번 : 825242160 , 점수 : 542732143
 이름 : Kim1 , 학번 : 1401006 , 점수 : 54
 이름 : ee3 54
1401026 Kim3 64
1401029 P▒>Ʉ , 학번 : 875573552 , 점수 : 842604624
 이름 : ark2 68
1401031 Cho2 53
1401034 ▒>Ʉ , 학번 : 825503793 , 점수 : 808662048
 이름 : Park1 , 학번 : 1401009 , 점수 : 68
 이름 : Jeong2 57
1401039 Kang2 62
14010▒>Ʉ , 학번 : 909249073 , 점수 : 875573552
 이름 : Cho1 , 학번 : 1401011 , 점수 : 63
 이름 : 1043 Lee5 78
1401046 Kim5 57
140▒>Ʉ , 학번 : 891303223 , 점수 : 170996784
 이름 : 1049 Park3 63
1401051 Cho3 64
14▒>Ʉ , 학번 : 1865621558 , 점수 : 873083188
.
.
.
이렇게 나오다가 어느순간 갑자기 제대로 출력이됩니다.
입력을 잘못한것도 아닌데 왜 이런건지 모르겠습니다
아래는 dblist.c 와 stdb2 를 만드는 dbcreate.c 코드입니다.
#include 
#include 
#include 
#include 
#include "student.h"
void dblist(int argc , char *argv[])
{
        int fd, id;
        struct student rec;
        if (( fd = open(argv[1] , O_RDONLY)) == -1 ) {
                perror(argv[1]);
                exit(2);
        }
        while(read(fd,(char *)&rec,sizeof(rec))>0) {
                if(rec.id == NULL)
                        lseek(fd,sizeof(rec),SEEK_CUR);
                if(rec.id != 0)
                        printf("이름 : %s , 학번 : %d , 점수 : %d \n " , rec.name , rec.id , rec.score);
        }
        close(fd);
}
#include 
#include 
#include 
#include 
#include "student.h"
/* 학생 정보를 입력받아 데이터베이스 파일에 저장한다. */
int main(int argc, char *argv[])
{
    int fd;
    struct student rec;
    if (argc < 2) {
        fprintf(stderr,  "사용법 : %s file\n", argv[0]);
        exit(1);
    }
    if ((fd = open(argv[1],O_WRONLY |O_CREAT, 0640))==-1) {
        perror(argv[1]);
        exit(2);
    }
    printf("%-9s %-8s %-4s", "학번",  "이름",  "점수");
    while (scanf("%d %s %d", &rec.id, rec.name, &rec.score) ==  3) {
        lseek(fd, (rec.id - START_ID) * sizeof(rec), SEEK_SET);
        write(fd, &rec, sizeof(rec) );
    }
    printf("record size= %d\n", sizeof(rec));
    close(fd);
    exit(0);
}
그리고 여기서 점수(내림차순) 으로 출력하고 점수가 같으면 학번(올림차순) 으로 정렬하는 코드 dbsort.c 를 만들었는데요, 여기는 버블정렬을 이용해서 짜려고하는데 생각이 잘 안되네요
아래는 dbsort.c입니다
#include 
#include 
#include 
#include 
#include "student.h"
int main(int argc, char *argv[])
{
        int fd, id;
        int buffer[100];
        int i, j, tmp;
        struct student rec;
        if ( argc < 2 ) {
                fprintf(stderr , "사용법 : %s file \n",argv[0]);
                exit(1);
        }
        if (( fd = open(argv[1] , O_RDONLY)) == -1 ) {
                perror(argv[1]);
                exit(2);
        }
        for ( i = 0 ; i < 100 ; i++ ) {
                buffer[i] = (lseek(fd,sizeof(rec),SEEK_CUR));
                for ( j = 1 ; j = 100-i ; j++ ) {
                        tmp = buffer[j -1];
                        buffer[j-1] = buffer[j];
                        buffer[tmp] = tmp;
                }
        }
        close(fd);
        exit(0);
        printf("정렬이 완료되었습니다");
}
dbsort.c는 제가 잘 모르는상태기도 하고 일단 때려박아봐서 코드가 이상한건 압니다만..
제가 생각하는 방식은
buffer[100] 에 각각 레코드의 score(점수) 를 집어넣고
예) buffer[0] = 1번레코드의 점수 , buffer[1] = 2번레코드의 점수 ...
이런식으로 넣어야 버블정렬을 할 수 있잖아요? 그래서 이런식으로 생각을해봤습니다만.. 어떻게 레코드의 score를 
불러낼지를 도저히 모르겠습니다.
부족한 학생이라 설명이 부족할 수 있습니다만 솔루션좀 제기해주시면 정말 감사하겠습니다.
좋은하루되세요.

어.. 코드가 들여쓰기가 전혀안되있네요
글 수정이 안되서 댓글로답니다 ㅠㅠ
dblist.c
#include #include
#include
#include
#include "student.h"
void dblist(int argc, char *argv[])
{
int fd, id;
struct student rec;
if ((fd = open(argv[1], O_RDONLY)) == -1) {
perror(argv[1]);
exit(2);
}
while (read(fd, (char *)&rec, sizeof(rec)) > 0) {
if (rec.id == NULL)
lseek(fd, sizeof(rec), SEEK_CUR);
if (rec.id != 0)
printf("이름 : %s , 학번 : %d , 점수 : %d \n ", rec.name, rec.id, rec.score);
}
close(fd);
}
dbcreate.c
#include
#include
#include
#include
#include "student.h"
/* 학생 정보를 입력받아 데이터베이스 파일에 저장한다. */
int main(int argc, char *argv[])
{
int fd;
struct student rec;
if (argc < 2) {
fprintf(stderr, "사용법 : %s file\n", argv[0]);
exit(1);
}
if ((fd = open(argv[1], O_WRONLY | O_CREAT, 0640)) == -1) {
perror(argv[1]);
exit(2);
}
printf("%-9s %-8s %-4s", "학번", "이름", "점수");
while (scanf("%d %s %d", &rec.id, rec.name, &rec.score) == 3) {
lseek(fd, (rec.id - START_ID) * sizeof(rec), SEEK_SET);
write(fd, &rec, sizeof(rec));
}
printf("record size= %d\n", sizeof(rec));
close(fd);
exit(0);
}
dbsort.c
#include
#include
#include
#include
#include "student.h"
int main(int argc, char *argv[])
{
int fd, id;
int buffer[100];
int i, j, tmp;
struct student rec;
if (argc < 2) {
fprintf(stderr, "사용법 : %s file \n", argv[0]);
exit(1);
}
if ((fd = open(argv[1], O_RDONLY)) == -1) {
perror(argv[1]);
exit(2);
}
for (i = 0; i < 100; i++) {
buffer[i] = (lseek(fd, sizeof(rec), SEEK_CUR));
for (j = 1; j = 100 - i; j++) {
tmp = buffer[j - 1];
buffer[j - 1] = buffer[j];
buffer[tmp] = tmp;
}
}
close(fd);
exit(0);
printf("정렬이 완료되었습니다");
}
아앗..이거도안되네 어떻게하는거죠..
dblist.c
#include #include
#include
#include
#include "student.h"
void dblist(int argc, char *argv[])
{
int fd, id;
struct student rec;
if ((fd = open(argv[1], O_RDONLY)) == -1) {
perror(argv[1]);
exit(2);
}
while (read(fd, (char *)&rec, sizeof(rec)) > 0) {
if (rec.id == NULL)
lseek(fd, sizeof(rec), SEEK_CUR);
if (rec.id != 0)
printf("이름 : %s , 학번 : %d , 점수 : %d \n ", rec.name, rec.id, rec.score);
}
close(fd);
}
dbcreate.c
#include
#include
#include
#include
#include "student.h"
/* 학생 정보를 입력받아 데이터베이스 파일에 저장한다. */
int main(int argc, char *argv[])
{
int fd;
struct student rec;
if (argc < 2) {
fprintf(stderr, "사용법 : %s file\n", argv[0]);
exit(1);
}
if ((fd = open(argv[1], O_WRONLY | O_CREAT, 0640)) == -1) {
perror(argv[1]);
exit(2);
}
printf("%-9s %-8s %-4s", "학번", "이름", "점수");
while (scanf("%d %s %d", &rec.id, rec.name, &rec.score) == 3) {
lseek(fd, (rec.id - START_ID) * sizeof(rec), SEEK_SET);
write(fd, &rec, sizeof(rec));
}
printf("record size= %d\n", sizeof(rec));
close(fd);
exit(0);
}
dbsort.c
#include
#include
#include
#include
#include "student.h"
int main(int argc, char *argv[])
{
int fd, id;
int buffer[100];
int i, j, tmp;
struct student rec;
if (argc < 2) {
fprintf(stderr, "사용법 : %s file \n", argv[0]);
exit(1);
}
if ((fd = open(argv[1], O_RDONLY)) == -1) {
perror(argv[1]);
exit(2);
}
for (i = 0; i < 100; i++) {
buffer[i] = (lseek(fd, sizeof(rec), SEEK_CUR));
for (j = 1; j = 100 - i; j++) {
tmp = buffer[j - 1];
buffer[j - 1] = buffer[j];
buffer[tmp] = tmp;
}
}
close(fd);
exit(0);
printf("정렬이 완료되었습니다");
}
참고해보세요.
구조체. 파일로 쓰고. 읽기 예제
https://ide-run.goorm.io
KLDP 에서는.
< code>
< /code> 로 코드를 묶어서 볼 수 있습니다.
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <memory.h> #include <string.h> typedef struct df_student { char name[10]; int id; int score; } student; #define START_ID 1 /* 이름 : Paek8 , 학번 : 1401161 , 점수 : 62 이름 : Lee13 , 학번 : 1401164 , 점수 : 58 이름 : Kim14 , 학번 : 1401165 , 점수 : 47 이름 : Park8 , 학번 : 1401168 , 점수 : 63 이름 : Cho6 , 학번 : 1401171 , 점수 : 44 이름 : You3 , 학번 : 1401174 , 점수 : 57 이름 : Jeong9 , 학번 : 1401177 , 점수 : 64 이름 : Yoon7 , 학번 : 1401180 , 점수 : 65 이름 : Lee14 , 학번 : 1401183 , 점수 : 59 */ //scanf() — 데이터 읽기 //https://www.ibm.com/support/knowledgecenter/ko/ssw_ibm_i_73/rtref/scanf.htm //fscanf() — 형식화된 데이터 읽기 //https://www.ibm.com/support/knowledgecenter/ko/ssw_ibm_i_73/rtref/fscanf.htm#fscanf //sscanf() — 데이터 읽기 //https://www.ibm.com/support/knowledgecenter/ko/ssw_ibm_i_73/rtref/sscanf.htm#sscanf void dblist(int argc , char *argv[]) { int fd, id; student rec; if (( fd = open(argv[1] , O_RDONLY)) == -1 ) { perror(argv[1]); exit(2); } printf("%-9s %-8s %-4s\n", "학번", "이름", "점수"); char buf[20]; int cnt = 0; // while(read(fd,(char *)&rec,sizeof(rec))>0) while(1) { if(cnt > 10) break; cnt++; //http://forum.falinux.com/zbxe/index.php?document_srl=466628&mid=C_LIB //정상적으로 실행되었다면 읽어들인 바이트 수를, 실패했다면 -1을 반환 // ssize_t r = read(fd,(char *)&buf[0], (int)sizeof(rec)); ssize_t r = read(fd, (char *)&rec, sizeof(rec)); if( r == -1 ) { break; } if( r == 0 ) { break; } // printf("----%s : %d\n", buf, (int)sizeof(rec)); // sscanf(buf, "%s,%d,%d", rec.name, &rec.id, &rec.score); // if(rec.id == 0) // lseek(fd,sizeof(rec),SEEK_CUR); // if(rec.id != 0) printf("이름 : %s , 학번 : %d , 점수 : %d \n" , rec.name , rec.id , rec.score); } close(fd); } /* 학생 정보를 입력받아 데이터베이스 파일에 저장한다. */ int main(int argc, char *argv[]) { //---------------------------- //쓰기 //---------------------------- int fd; student rec; if (argc < 2) { fprintf(stderr, "사용법 : %s file\n", argv[0]); exit(1); } // if ((fd = open(argv[1],O_WRONLY |O_CREAT, 0640))==-1) { perror(argv[1]); exit(2); } student s; memset(&s, 0x00, sizeof(s)); strcpy(s.name, "Lee13"); s.id = 1401164; s.score = 58; write(fd, &s, sizeof(s)); strcpy(s.name, "Kim14"); s.id = 1401165; s.score = 47; write(fd, &s, sizeof(s)); strcpy(s.name, "Park8"); s.id = 1401168; s.score = 63; write(fd, &s, sizeof(s)); strcpy(s.name, "Cho6"); s.id = 1401171; s.score = 44; write(fd, &s, sizeof(s)); strcpy(s.name, "You3"); s.id = 1401174; s.score = 57; write(fd, &s, sizeof(s)); strcpy(s.name, "Jeong9"); s.id = 1401177; s.score = 64; write(fd, &s, sizeof(s)); strcpy(s.name, "Yoon7"); s.id = 1401180; s.score = 65; write(fd, &s, sizeof(s)); strcpy(s.name, "Lee14"); s.id = 1401183; s.score = 59; write(fd, &s, sizeof(s)); /* printf("%-9s %-8s %-4s\n", "학번", "이름", "점수"); while (scanf("%s %d %d", rec.name, &rec.id, &rec.score) == 3) { lseek(fd, (rec.id - START_ID) * sizeof(rec), SEEK_SET); write(fd, &rec, sizeof(rec) ); } printf("record size= %d\n", (int)sizeof(rec)); */ close(fd); //---------------------------- //읽기 //---------------------------- dblist(argc , argv); exit(0); }----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
참고해보세요.
파일에서 한줄 바꾸기 예제 소스
lseek(fd2, sizeof(rec)*(cnt), SEEK_CUR);에서. SEEK_SET으로 사용하셔야 할겁니다. ㅇ_ㅇ;;
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <memory.h> #include <string.h> typedef struct df_student { char name[10]; int id; int score; } student; #define START_ID 1 /* 이름 : Paek8 , 학번 : 1401161 , 점수 : 62 이름 : Lee13 , 학번 : 1401164 , 점수 : 58 이름 : Kim14 , 학번 : 1401165 , 점수 : 47 이름 : Park8 , 학번 : 1401168 , 점수 : 63 이름 : Cho6 , 학번 : 1401171 , 점수 : 44 이름 : You3 , 학번 : 1401174 , 점수 : 57 이름 : Jeong9 , 학번 : 1401177 , 점수 : 64 이름 : Yoon7 , 학번 : 1401180 , 점수 : 65 이름 : Lee14 , 학번 : 1401183 , 점수 : 59 */ /* 5 8 3 9 2 5<8 5<3 3 8 5 9 2 5<9 5<2 3 8 2 9 5 3<8 3<2 2 8 3 9 5 2<8 2<3 2<9 2<5 8<3 2 3 8 9 5 8<9 8<5 2 3 5 9 8 9<8 2 3 5 8 9 */ void sort() { } void dblist(int argc , char *argv[]) { int fd1, fd2, fd3, id; student rec; //비교용 if (( fd1 = open(argv[1] , O_RDONLY )) == -1 ) { perror(argv[1]); exit(2); } //쓰기용 if (( fd2 = open(argv[1] , O_WRONLY)) == -1 ) { perror(argv[1]); exit(2); } //값 읽기용 if (( fd3 = open(argv[1] , O_RDONLY )) == -1 ) { perror(argv[1]); exit(2); } printf("%-9s %-8s %-4s\n", "학번", "이름", "점수"); char buf[20]; student t; student f; memset(&t, 0x00, sizeof(t)); int cnt = 0; int cnt_pos = 0; // while(read(fd,(char *)&rec,sizeof(rec))>0) while(1) { if(cnt > 10) break; //http://forum.falinux.com/zbxe/index.php?document_srl=466628&mid=C_LIB //정상적으로 실행되었다면 읽어들인 바이트 수를, 실패했다면 -1을 반환 // ssize_t r = read(fd,(char *)&buf[0], (int)sizeof(rec)); ssize_t r = read(fd1, (char *)&rec, sizeof(rec)); if( r == -1 ) { break; } if( r == 0 ) { break; } // printf("----%s : %d\n", buf, (int)sizeof(rec)); // sscanf(buf, "%s,%d,%d", rec.name, &rec.id, &rec.score); // if(rec.id == 0) // lseek(fd,sizeof(rec),SEEK_CUR); // if(rec.id != 0) printf("[비교] 이름 : %s , 학번 : %d , 점수 : %d \t" , f.name , f.id , f.score); printf("[앞] 이름 : %s , 학번 : %d , 점수 : %d \t" , t.name , t.id , t.score); printf("[뒤] 이름 : %s , 학번 : %d , 점수 : %d \n" , rec.name , rec.id , rec.score); if(t.id == 0) { t = rec; continue; } else { //다음값이 더 크면. if(t.id < rec.id) { //다음으로 진행 } else { //교환 cnt_pos++; //앞 값 읽어두기 lseek(fd3, sizeof(rec)*(cnt-1), SEEK_CUR); read(fd3, (char *)&f, sizeof(rec)); //앞 값에 저장 lseek(fd2, sizeof(rec)*(cnt-1), SEEK_CUR); write(fd2, &rec, sizeof(rec)); //뒤 값에 저장 lseek(fd2, sizeof(rec)*(cnt), SEEK_CUR); write(fd2, &f, sizeof(rec)); break; } } t = rec; cnt++; } close(fd1); close(fd2); close(fd3); } void dblist2(int argc , char *argv[]) { int fd, id; student rec; if (( fd = open(argv[1] , O_RDONLY)) == -1 ) { perror(argv[1]); exit(2); } printf("%-9s %-8s %-4s\n", "학번", "이름", "점수"); char buf[20]; int cnt = 0; while(1) { if(cnt > 10) break; cnt++; ssize_t r = read(fd, (char *)&rec, sizeof(rec)); if( r == -1 ) { break; } if( r == 0 ) { break; } printf("이름 : %s , 학번 : %d , 점수 : %d \n" , rec.name , rec.id , rec.score); } close(fd); } /* 학생 정보를 입력받아 데이터베이스 파일에 저장한다. */ int main(int argc, char *argv[]) { //---------------------------- //쓰기 //---------------------------- int fd; student rec; if (argc < 2) { fprintf(stderr, "사용법 : %s file\n", argv[0]); exit(1); } // if ((fd = open(argv[1],O_WRONLY |O_CREAT, 0640))==-1) { perror(argv[1]); exit(2); } student s; memset(&s, 0x00, sizeof(s)); strcpy(s.name, "Kim14"); s.id = 1401165; s.score = 47; write(fd, &s, sizeof(s)); strcpy(s.name, "Yoon7"); s.id = 1401180; s.score = 65; write(fd, &s, sizeof(s)); strcpy(s.name, "Lee13"); s.id = 1401164; s.score = 58; write(fd, &s, sizeof(s)); strcpy(s.name, "Cho6"); s.id = 1401171; s.score = 44; write(fd, &s, sizeof(s)); strcpy(s.name, "Jeong9"); s.id = 1401177; s.score = 64; write(fd, &s, sizeof(s)); strcpy(s.name, "Park8"); s.id = 1401168; s.score = 63; write(fd, &s, sizeof(s)); strcpy(s.name, "You3"); s.id = 1401174; s.score = 57; write(fd, &s, sizeof(s)); strcpy(s.name, "Lee14"); s.id = 1401183; s.score = 59; write(fd, &s, sizeof(s)); /* printf("%-9s %-8s %-4s\n", "학번", "이름", "점수"); while (scanf("%s %d %d", rec.name, &rec.id, &rec.score) == 3) { lseek(fd, (rec.id - START_ID) * sizeof(rec), SEEK_SET); write(fd, &rec, sizeof(rec) ); } printf("record size= %d\n", (int)sizeof(rec)); */ close(fd); printf("\n"); //---------------------------- //읽기 //---------------------------- dblist(argc , argv); printf("\n"); dblist2(argc , argv); printf("\n"); exit(0); } 학번 이름 점수 [비교] 이름 : , 학번 : 32764 , 점수 : 4196288 [앞] 이름 : , 학번 : 0 , 점수 : 0 [뒤] 이름 : Kim14 , 학번 : 1401165 , 점수 : 47 [비교] 이름 : , 학번 : 32764 , 점수 : 4196288 [앞] 이름 : Kim14 , 학번 : 1401165 , 점수 : 47 [뒤] 이름 : Yoon7 , 학번 : 1401180 , 점수 : 65 [비교] 이름 : , 학번 : 32764 , 점수 : 4196288 [앞] 이름 : Yoon7 , 학번 : 1401180 , 점수 : 65 [뒤] 이름 : Lee13 , 학번 : 1401164 , 점수 : 58 학번 이름 점수 이름 : Lee13 , 학번 : 1401164 , 점수 : 58 이름 : Yoon7 , 학번 : 1401180 , 점수 : 65 이름 : Kim14 , 학번 : 1401165 , 점수 : 47 이름 : Cho6 , 학번 : 1401171 , 점수 : 44 이름 : Jeong9 , 학번 : 1401177 , 점수 : 64 이름 : Park8 , 학번 : 1401168 , 점수 : 63 이름 : You3 , 학번 : 1401174 , 점수 : 57 이름 : Lee14 , 학번 : 1401183 , 점수 : 59 이름 : , 학번 : 0 , 점수 : 0 이름 : , 학번 : 0 , 점수 : 0 이름 : , 학번 : 0 , 점수 : 1699348480----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
참고해보세요.
정렬된 예제
https://ide-run.goorm.io/
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <memory.h> #include <string.h> typedef struct df_student { char name[10]; int id; int score; } student; #define START_ID 1 #define MAX 8 /* 이름 : Paek8 , 학번 : 1401161 , 점수 : 62 이름 : Lee13 , 학번 : 1401164 , 점수 : 58 이름 : Kim14 , 학번 : 1401165 , 점수 : 47 이름 : Park8 , 학번 : 1401168 , 점수 : 63 이름 : Cho6 , 학번 : 1401171 , 점수 : 44 이름 : You3 , 학번 : 1401174 , 점수 : 57 이름 : Jeong9 , 학번 : 1401177 , 점수 : 64 이름 : Yoon7 , 학번 : 1401180 , 점수 : 65 이름 : Lee14 , 학번 : 1401183 , 점수 : 59 */ /* cnt_pos 0 1 2 3 4 cnt 5 8 3 9 2 5<3 0<2 start_pos < cnt 3 8 5 9 2 5<2 0<4 3 8 2 9 5 <---- 여기까지 한번이 완료. 3<2 0<2 2 8 3 9 5 <---- 여기까지 한번이 완료. 8<3 1<2 2 3 8 9 5 8<5 3<4 2 3 5 9 8 <---- 여기까지 한번이 완료. 9<8 3<4 2 3 5 8 9 <---- 여기까지 한번이 완료. http://codepad.org/Fk1Gy3WQ #include <stdio.h> #define MAX 5 int main() { int i; int j; int k; char data[MAX] = {5,8,3,9,2}; for(k=0; k<MAX; k++) { printf("%d ", data[k]); } printf("\n"); char tmp; char buf; for(i=0; i<MAX; i++) { tmp = data[i]; for(j=i; j<MAX; j++) { if(j > i) { printf("buf:%d tmp:%d data[i]:%d data[j]:%d \t", buf, tmp, data[i], data[j]); if(data[i] > data[j]) { char t = data[i]; data[i] = data[j]; data[j] = t; for(k=0; k<; k++) { printf("%d ", data[k]); } printf("\n"); } } if(buf < tmp) { } buf = tmp; } } return 0; } 5 8 3 9 2 buf:5 tmp:5 data[i]:5 data[j]:8 buf:5 tmp:5 data[i]:5 data[j]:3 3 8 5 9 2 buf:5 tmp:5 data[i]:3 data[j]:9 buf:5 tmp:5 data[i]:3 data[j]:2 2 8 5 9 3 buf:8 tmp:8 data[i]:8 data[j]:5 2 5 8 9 3 buf:8 tmp:8 data[i]:5 data[j]:9 buf:8 tmp:8 data[i]:5 data[j]:3 2 3 8 9 5 buf:8 tmp:8 data[i]:8 data[j]:9 buf:8 tmp:8 data[i]:8 data[j]:5 2 3 5 9 8 buf:9 tmp:9 data[i]:9 data[j]:8 2 3 5 8 9 */ void dblist2(int argc , char *argv[]); void sort() { } void dblist(int argc , char *argv[]) { int fd1, fd2, fd3, id; student rec; //비교용 if (( fd1 = open(argv[1] , O_RDWR)) == -1 ) { perror(argv[1]); exit(2); } //쓰기용 if (( fd2 = open(argv[1] , O_RDWR)) == -1 ) { perror(argv[1]); exit(2); } //값 읽기용 if (( fd3 = open(argv[1] , O_RDWR )) == -1 ) { perror(argv[1]); exit(2); } printf("%-9s %-8s %-4s\n", "학번", "이름", "점수"); int i; int j; int k; // dblist2(argc , argv); printf("\n"); char buf; for(i=0; i<MAX; i++) { // tmp = data[i]; // ssize_t r = lseek(fd1, sizeof(rec)*(i), SEEK_SET); if(r == -1) { printf("lseek faile\n"); } r = read(fd1, (char *)&rec, sizeof(rec)); if( r == -1 ) { printf("읽기 종료\n"); break; } student s = rec; for(j=i; j<MAX; j++) { if(j > i) { //여기서 한번 더 읽어 줘야. i 값이 정상적으로 읽어짐. r = lseek(fd1, sizeof(rec)*(i), SEEK_SET); if(r == -1) { printf("lseek faile\n"); } r = read(fd1, (char *)&rec, sizeof(rec)); if( r == -1 ) { printf("읽기 종료\n"); break; } s = rec; // r = lseek(fd1, sizeof(rec)*(j), SEEK_SET); if(r == -1) { printf("lseek faile\n"); } r = read(fd1, (char *)&rec, sizeof(rec)); if( r == -1 ) { printf("읽기 종료\n"); break; } student t = rec; // printf("buf:%d tmp:%d data[i]:%d data[j]:%d \t", buf, tmp, data[i], data[j]); printf("[i:%d]s:%s %d [j:%d]t:%s %d\n", i, s.name, s.id, j, t.name, t.id); // if(data[i] > data[j]) if(s.id > t.id) { // char t = data[i]; // data[i] = data[j]; // data[j] = t; //앞 값에 저장 r = lseek(fd1, sizeof(rec)*(i), SEEK_SET); if(r == -1) { printf("lseek faile\n"); } write(fd1, &t, sizeof(rec)); //뒤 값에 저장 r = lseek(fd1, sizeof(rec)*(j), SEEK_SET); if(r == -1) { printf("lseek faile\n"); } write(fd1, &s, sizeof(rec)); // dblist2(argc , argv); printf("\n"); } } } } /* // FILE * fp2 = fdopen(fd2, "wb"); char buf[20]; student t; student f; memset(&t, 0x00, sizeof(t)); int cnt = 0; int cnt_pos = 0; int start_pos = 0; // while(read(fd,(char *)&rec,sizeof(rec))>0) printf("vvvvvvvvvvvv\n"); while(1) { // if(cnt > 8) break; //http://forum.falinux.com/zbxe/index.php?document_srl=466628&mid=C_LIB //정상적으로 실행되었다면 읽어들인 바이트 수를, 실패했다면 -1을 반환 // ssize_t r = read(fd,(char *)&buf[0], (int)sizeof(rec)); ssize_t r = read(fd1, (char *)&rec, sizeof(rec)); if( r == -1 ) { printf("읽기 종료\n"); break; } if( cnt >= 8 ) { // break; cnt_pos++; printf("전체 한번 완료 : %d \n", cnt_pos); //전체 한번 완료 //처음으로 이동 // off_t r = lseek(fd1, sizeof(rec)*(cnt_pos), SEEK_SET); off_t r = lseek(fd1, 0, SEEK_SET); if(r == -1) { printf("lseek faile\n"); } // if(cnt_pos > 3) { printf("전체 값 비교를 모두 완료한 경우. 종료\n"); break; } cnt = 0; continue; } if(cnt == 0) { f = rec; // start_pos = cnt_pos; start_pos = 0; } //How can you flush a write using a file descriptor? //https://stackoverflow.com/questions/259355/how-can-you-flush-a-write-using-a-file-descriptor printf("cnt : %d start_pos : %d \t", cnt, start_pos); printf("[비교] 이름 : %s , 학번 : %d , 점수 : %d \t" , f.name , f.id , f.score); printf("[뒤] 이름 : %s , 학번 : %d , 점수 : %d \n" , rec.name , rec.id , rec.score); if(cnt == 0) { cnt++; continue; } else { //다음값이 더 크면. if(f.id < rec.id) { //다음으로 진행 lseek(fd1, sizeof(rec)*(cnt+1), SEEK_CUR); start_pos = cnt_pos+cnt-1; break; } else { //교환 printf("교환 발생\n"); // close(fd2); // //쓰기용 // if (( fd2 = open(argv[1] , O_RDWR)) == -1 ) // { // perror(argv[1]); // exit(2); // } //앞 값 읽어두기 // lseek(fd3, sizeof(rec)*(cnt_pos), SEEK_CUR); // read(fd3, (char *)&f, sizeof(rec)); printf("[%d] %s %d <- [%d] %s %d\n", start_pos, f.name, f.id, cnt, rec.name, rec.id); // fsync(fd1); fdatasync(fd1); // fsync(fd2); fdatasync(fd2); //앞 값에 저장 off_t r = lseek(fd2, sizeof(rec)*(start_pos), SEEK_SET); if(r == -1) { printf("lseek faile\n"); } // rec.id = 11111; // fwrite(&rec, 1, sizeof(rec), fp2); // fwrite(&rec, sizeof(rec), 1, fp2); write(fd2, &rec, sizeof(rec)); // fsync(fd1); fdatasync(fd1); // fsync(fd2); fdatasync(fd2); //뒤 값에 저장 r = lseek(fd2, sizeof(rec)*(cnt), SEEK_SET); if(r == -1) { printf("lseek faile\n"); } // f.id = 22222; // fwrite(&f, 1, sizeof(rec), fp2); // fwrite(&f, sizeof(rec), 1, fp2); write(fd2, &f, sizeof(rec)); // fsync(fd1); fdatasync(fd1); // fsync(fd2); fdatasync(fd2); dblist2(argc , argv); printf("\n"); } } cnt++; } */ close(fd1); close(fd2); close(fd3); // fclose(fp2); } void dblist2(int argc , char *argv[]) { int fd, id; student rec; if (( fd = open(argv[1] , O_RDONLY)) == -1 ) { perror(argv[1]); exit(2); } printf("%-9s %-8s %-4s\n", "학번", "이름", "점수"); char buf[20]; int cnt = 0; while(1) { if(cnt > 8) break; ssize_t r = read(fd, (char *)&rec, sizeof(rec)); if( r == -1 ) { break; } if( r == 0 ) { break; } printf("[%d] 이름 : %s , 학번 : %d , 점수 : %d \n" , cnt, rec.name , rec.id , rec.score); cnt++; } close(fd); } /* 학생 정보를 입력받아 데이터베이스 파일에 저장한다. */ int main(int argc, char *argv[]) { //---------------------------- //화면 초기화 //---------------------------- system("clear"); //---------------------------- //기존 파일 삭제 //---------------------------- system("rm student.txt"); //---------------------------- //쓰기 //---------------------------- int fd; student rec; if (argc < 2) { fprintf(stderr, "사용법 : %s file\n", argv[0]); exit(1); } // if ((fd = open(argv[1], O_RDWR |O_CREAT, 0640))==-1) { perror(argv[1]); exit(2); } student s; memset(&s, 0x00, sizeof(s)); strcpy(s.name, "Kim14"); s.id = 1401165; s.score = 47; write(fd, &s, sizeof(s)); strcpy(s.name, "Yoon7"); s.id = 1401180; s.score = 65; write(fd, &s, sizeof(s)); strcpy(s.name, "Lee13"); s.id = 1401164; s.score = 58; write(fd, &s, sizeof(s)); strcpy(s.name, "Cho6"); s.id = 1401171; s.score = 44; write(fd, &s, sizeof(s)); strcpy(s.name, "Jeong9"); s.id = 1401177; s.score = 64; write(fd, &s, sizeof(s)); strcpy(s.name, "Park8"); s.id = 1401168; s.score = 63; write(fd, &s, sizeof(s)); strcpy(s.name, "You3"); s.id = 1401174; s.score = 57; write(fd, &s, sizeof(s)); strcpy(s.name, "Lee14"); s.id = 1401183; s.score = 59; write(fd, &s, sizeof(s)); /* printf("%-9s %-8s %-4s\n", "학번", "이름", "점수"); while (scanf("%s %d %d", rec.name, &rec.id, &rec.score) == 3) { lseek(fd, (rec.id - START_ID) * sizeof(rec), SEEK_SET); write(fd, &rec, sizeof(rec) ); } printf("record size= %d\n", (int)sizeof(rec)); */ close(fd); printf("\n"); //---------------------------- //읽기 //---------------------------- dblist2(argc , argv); printf("\n"); dblist(argc , argv); printf("\n"); dblist2(argc , argv); printf("\n"); exit(0); } // 학번 이름 점수 [0] 이름 : Kim14 , 학번 : 1401165 , 점수 : 47 [1] 이름 : Yoon7 , 학번 : 1401180 , 점수 : 65 [2] 이름 : Lee13 , 학번 : 1401164 , 점수 : 58 [3] 이름 : Cho6 , 학번 : 1401171 , 점수 : 44 [4] 이름 : Jeong9 , 학번 : 1401177 , 점수 : 64 [5] 이름 : Park8 , 학번 : 1401168 , 점수 : 63 [6] 이름 : You3 , 학번 : 1401174 , 점수 : 57 [7] 이름 : Lee14 , 학번 : 1401183 , 점수 : 59 학번 이름 점수 학번 이름 점수 [0] 이름 : Kim14 , 학번 : 1401165 , 점수 : 47 [1] 이름 : Yoon7 , 학번 : 1401180 , 점수 : 65 [2] 이름 : Lee13 , 학번 : 1401164 , 점수 : 58 [3] 이름 : Cho6 , 학번 : 1401171 , 점수 : 44 [4] 이름 : Jeong9 , 학번 : 1401177 , 점수 : 64 [5] 이름 : Park8 , 학번 : 1401168 , 점수 : 63 [6] 이름 : You3 , 학번 : 1401174 , 점수 : 57 [7] 이름 : Lee14 , 학번 : 1401183 , 점수 : 59 [i:0]s:Kim14 1401165 [j:1]t:Yoon7 1401180 [i:0]s:Kim14 1401165 [j:2]t:Lee13 1401164 학번 이름 점수 [0] 이름 : Lee13 , 학번 : 1401164 , 점수 : 58 [1] 이름 : Yoon7 , 학번 : 1401180 , 점수 : 65 [2] 이름 : Kim14 , 학번 : 1401165 , 점수 : 47 [3] 이름 : Cho6 , 학번 : 1401171 , 점수 : 44 [4] 이름 : Jeong9 , 학번 : 1401177 , 점수 : 64 [5] 이름 : Park8 , 학번 : 1401168 , 점수 : 63 [6] 이름 : You3 , 학번 : 1401174 , 점수 : 57 [7] 이름 : Lee14 , 학번 : 1401183 , 점수 : 59 [i:0]s:Lee13 1401164 [j:3]t:Cho6 1401171 [i:0]s:Lee13 1401164 [j:4]t:Jeong9 1401177 [i:0]s:Lee13 1401164 [j:5]t:Park8 1401168 [i:0]s:Lee13 1401164 [j:6]t:You3 1401174 [i:0]s:Lee13 1401164 [j:7]t:Lee14 1401183 [i:1]s:Yoon7 1401180 [j:2]t:Kim14 1401165 학번 이름 점수 [0] 이름 : Lee13 , 학번 : 1401164 , 점수 : 58 [1] 이름 : Kim14 , 학번 : 1401165 , 점수 : 47 [2] 이름 : Yoon7 , 학번 : 1401180 , 점수 : 65 [3] 이름 : Cho6 , 학번 : 1401171 , 점수 : 44 [4] 이름 : Jeong9 , 학번 : 1401177 , 점수 : 64 [5] 이름 : Park8 , 학번 : 1401168 , 점수 : 63 [6] 이름 : You3 , 학번 : 1401174 , 점수 : 57 [7] 이름 : Lee14 , 학번 : 1401183 , 점수 : 59 [i:1]s:Kim14 1401165 [j:3]t:Cho6 1401171 [i:1]s:Kim14 1401165 [j:4]t:Jeong9 1401177 [i:1]s:Kim14 1401165 [j:5]t:Park8 1401168 [i:1]s:Kim14 1401165 [j:6]t:You3 1401174 [i:1]s:Kim14 1401165 [j:7]t:Lee14 1401183 [i:2]s:Yoon7 1401180 [j:3]t:Cho6 1401171 학번 이름 점수 [0] 이름 : Lee13 , 학번 : 1401164 , 점수 : 58 [1] 이름 : Kim14 , 학번 : 1401165 , 점수 : 47 [2] 이름 : Cho6 , 학번 : 1401171 , 점수 : 44 [3] 이름 : Yoon7 , 학번 : 1401180 , 점수 : 65 [4] 이름 : Jeong9 , 학번 : 1401177 , 점수 : 64 [5] 이름 : Park8 , 학번 : 1401168 , 점수 : 63 [6] 이름 : You3 , 학번 : 1401174 , 점수 : 57 [7] 이름 : Lee14 , 학번 : 1401183 , 점수 : 59 [i:2]s:Cho6 1401171 [j:4]t:Jeong9 1401177 [i:2]s:Cho6 1401171 [j:5]t:Park8 1401168 학번 이름 점수 [0] 이름 : Lee13 , 학번 : 1401164 , 점수 : 58 [1] 이름 : Kim14 , 학번 : 1401165 , 점수 : 47 [2] 이름 : Park8 , 학번 : 1401168 , 점수 : 63 [3] 이름 : Yoon7 , 학번 : 1401180 , 점수 : 65 [4] 이름 : Jeong9 , 학번 : 1401177 , 점수 : 64 [5] 이름 : Cho6 , 학번 : 1401171 , 점수 : 44 [6] 이름 : You3 , 학번 : 1401174 , 점수 : 57 [7] 이름 : Lee14 , 학번 : 1401183 , 점수 : 59 [i:2]s:Park8 1401168 [j:6]t:You3 1401174 [i:2]s:Park8 1401168 [j:7]t:Lee14 1401183 [i:3]s:Yoon7 1401180 [j:4]t:Jeong9 1401177 학번 이름 점수 [0] 이름 : Lee13 , 학번 : 1401164 , 점수 : 58 [1] 이름 : Kim14 , 학번 : 1401165 , 점수 : 47 [2] 이름 : Park8 , 학번 : 1401168 , 점수 : 63 [3] 이름 : Jeong9 , 학번 : 1401177 , 점수 : 64 [4] 이름 : Yoon7 , 학번 : 1401180 , 점수 : 65 [5] 이름 : Cho6 , 학번 : 1401171 , 점수 : 44 [6] 이름 : You3 , 학번 : 1401174 , 점수 : 57 [7] 이름 : Lee14 , 학번 : 1401183 , 점수 : 59 [i:3]s:Jeong9 1401177 [j:5]t:Cho6 1401171 학번 이름 점수 [0] 이름 : Lee13 , 학번 : 1401164 , 점수 : 58 [1] 이름 : Kim14 , 학번 : 1401165 , 점수 : 47 [2] 이름 : Park8 , 학번 : 1401168 , 점수 : 63 [3] 이름 : Cho6 , 학번 : 1401171 , 점수 : 44 [4] 이름 : Yoon7 , 학번 : 1401180 , 점수 : 65 [5] 이름 : Jeong9 , 학번 : 1401177 , 점수 : 64 [6] 이름 : You3 , 학번 : 1401174 , 점수 : 57 [7] 이름 : Lee14 , 학번 : 1401183 , 점수 : 59 [i:3]s:Cho6 1401171 [j:6]t:You3 1401174 [i:3]s:Cho6 1401171 [j:7]t:Lee14 1401183 [i:4]s:Yoon7 1401180 [j:5]t:Jeong9 1401177 학번 이름 점수 [0] 이름 : Lee13 , 학번 : 1401164 , 점수 : 58 [1] 이름 : Kim14 , 학번 : 1401165 , 점수 : 47 [2] 이름 : Park8 , 학번 : 1401168 , 점수 : 63 [3] 이름 : Cho6 , 학번 : 1401171 , 점수 : 44 [4] 이름 : Jeong9 , 학번 : 1401177 , 점수 : 64 [5] 이름 : Yoon7 , 학번 : 1401180 , 점수 : 65 [6] 이름 : You3 , 학번 : 1401174 , 점수 : 57 [7] 이름 : Lee14 , 학번 : 1401183 , 점수 : 59 [i:4]s:Jeong9 1401177 [j:6]t:You3 1401174 학번 이름 점수 [0] 이름 : Lee13 , 학번 : 1401164 , 점수 : 58 [1] 이름 : Kim14 , 학번 : 1401165 , 점수 : 47 [2] 이름 : Park8 , 학번 : 1401168 , 점수 : 63 [3] 이름 : Cho6 , 학번 : 1401171 , 점수 : 44 [4] 이름 : You3 , 학번 : 1401174 , 점수 : 57 [5] 이름 : Yoon7 , 학번 : 1401180 , 점수 : 65 [6] 이름 : Jeong9 , 학번 : 1401177 , 점수 : 64 [7] 이름 : Lee14 , 학번 : 1401183 , 점수 : 59 [i:4]s:You3 1401174 [j:7]t:Lee14 1401183 [i:5]s:Yoon7 1401180 [j:6]t:Jeong9 1401177 학번 이름 점수 [0] 이름 : Lee13 , 학번 : 1401164 , 점수 : 58 [1] 이름 : Kim14 , 학번 : 1401165 , 점수 : 47 [2] 이름 : Park8 , 학번 : 1401168 , 점수 : 63 [3] 이름 : Cho6 , 학번 : 1401171 , 점수 : 44 [4] 이름 : You3 , 학번 : 1401174 , 점수 : 57 [5] 이름 : Jeong9 , 학번 : 1401177 , 점수 : 64 [6] 이름 : Yoon7 , 학번 : 1401180 , 점수 : 65 [7] 이름 : Lee14 , 학번 : 1401183 , 점수 : 59 [i:5]s:Jeong9 1401177 [j:7]t:Lee14 1401183 [i:6]s:Yoon7 1401180 [j:7]t:Lee14 1401183 학번 이름 점수 [0] 이름 : Lee13 , 학번 : 1401164 , 점수 : 58 [1] 이름 : Kim14 , 학번 : 1401165 , 점수 : 47 [2] 이름 : Park8 , 학번 : 1401168 , 점수 : 63 [3] 이름 : Cho6 , 학번 : 1401171 , 점수 : 44 [4] 이름 : You3 , 학번 : 1401174 , 점수 : 57 [5] 이름 : Jeong9 , 학번 : 1401177 , 점수 : 64 [6] 이름 : Yoon7 , 학번 : 1401180 , 점수 : 65 [7] 이름 : Lee14 , 학번 : 1401183 , 점수 : 59----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
와...이렇게 정성스럽게 답변해주시다니
정말 감사합니다 너무 도움이됐어요 ㅠㅠㅠㅠ 복받으실겁니다
저도 쓸일이 있을겁니다.
...
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기