[완료]fread 사용중 문제..
글쓴이: mtg1 / 작성시간: 월, 2010/04/19 - 12:19오후
typedef struct field{ short l;//전체 길이 int num;//번호 short len;//필드2(이름) 길이 char name[20];//사원이름? float f;//평점 char s;//성별 }FI;//이게 구조체고... //코드 본문에서 썼던 것 중 문제되는 부분이.. fread(&fi[z].len,2,1,fp1); fread(&fi[z].name,fi[z].len,1,fp1);//이 부분이 문제가 되네요. printf("%s", fi[z].name);
저 부분을 실행하면 이상한 문자만 쭈~욱 출력됩니다...
Forums:
올려주신 코드만 봐서는....
올려주신 코드만 가지고는 문제를 알기 어려울 것 같네요.
데이터 파일의 내용이라던가...
fread후 들어가는 값을 확인해 보시면 될 것 같은데요.
추정되는 문제라면, 이름 끝에 NULL이 안들어간다거나...
덕분에 도움이 되었습니다.
다른 문제가 튀어나오긴 했지만..(..)
일단 이 문제는 해결이네요. 진짜 감사합니다.^^
제가 보기에는 word
제가 보기에는 word boundary 문제일거 같군요...
typedef struct field{
short l;//전체 길이
int num;//번호
short len;//필드2(이름) 길이
char name[20];//사원이름?
float f;//평점
char s;//성별
}FI;//이게 구조체고...
위와 같이 구조체를 선언할 경우
아래와 같이 값이 들어간다고 봐야 합니다.. hex code로 봤을 때..
00 00 (short)
xx xx (boundary word 에 의한 빈 공간)
00 00 00 00 (int)
위와 같이 값이 저장되어 있기 때문에 사용하신 것과 같은 방법으로 읽으실 경우 잘못된 위치에서 읽어오게 되는거죠..
그렇기 때문에.. boundary 를 계산해서 구조체를 선언하는게 안정적인 코딩 방법입니다..
ypedef struct field{
short l;//전체 길이
short len;//필드2(이름) 길이
int num;//번호
char name[20];//사원이름?
float f;//평점
char s[1];//성별
char dummy[3]; // dummy
}FI;
팁으로 말씀드리자면... name 항목을 가변 길이로 사용하실 게 아니라면 굳이.. 위와 같이 개별 항목으로 fread하실 필요 없이..
FI var;
fread(&var, sizeof(FI), 1, fp1);
식으로 하시면 정확하게 읽어올 것입니다..
안타깝게도;;
가변길이를 해야하니 이러고있지요..뉴_뉴..
그렇다면.. 구조체
그렇다면.. 구조체 설계부터 다시 해야하는게 맞습니다.
char name[20];//사원이름?
과 같이 고정 길이로 사용하시면.. name 에 1byte를 넣던... 20byte를 넣던... 20byte가 들어가겠죠?
간단하게 얘기하자면..
struct mFieild {
int nLen;
char *name;
};
이런식으로 하셔야 가변이라고 할 수 있겠죠..
그렇군요..
도움말씀 감사합니다.
댓글 달기