안녕하세요 리눅스 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> 로 코드를 묶어서 볼 수 있습니다.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
참고해보세요.
파일에서 한줄 바꾸기 예제 소스
lseek(fd2, sizeof(rec)*(cnt), SEEK_CUR);에서. SEEK_SET으로 사용하셔야 할겁니다. ㅇ_ㅇ;;
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
참고해보세요.
정렬된 예제
https://ide-run.goorm.io/
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
와...이렇게 정성스럽게 답변해주시다니
정말 감사합니다 너무 도움이됐어요 ㅠㅠㅠㅠ 복받으실겁니다
저도 쓸일이 있을겁니다.
...
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기