c언어 질문입니다. (제목도 적당한것이 떠오르질 않아..)
글쓴이: sydsyddl / 작성시간: 금, 2008/08/22 - 1:09오전
int load_member_data(char *file_name, MEMBER member_list[]) { int count; // used for index of member list FILE *fp; MEMBER m; // open data file fp = fopen(file_name, "r"); if (fp == NULL) { fprintf(stderr, "Can't open %s!!!", file_name); exit(1); } // read data count = 0; while (!feof(fp)) { fscanf(fp, "%d%s%s", &m.member_id, &m.member_name, m.member_ssn); member_list[count] = m; count++; if(count >= MAX_MEMBERS) { fprintf(stderr, "Too many data in %s !!", file_name); } } fclose(fp); return count; }
메인에서 member.dat라는 파일이름을 인자로 넘겨받아서 그안의 자료들을
member_list 구조체 배열에 집어넣는 함수인데
음.. member.dat라는 파일이
1 뇽뇽이 1611111
2 포로리 2183821
3 후르륵 3333333
5 주르륵 5555555
4 날봐날 4444444
이런식으로 되어 있습니다.
load_member_data라는 함수에서 fscanf를 이용해서
member_id, member_name, member_ssn 각각 맴버변수들에 집어넣게 되는데요
gcc로 컴파일 해서 실행을 하니까
count값이 6이 되고
visual c++9.0환경에서 컴파일 하고 실행을 하니까
count값이 5가 됩니다.
그러니까..
member.dat라는 파일에 자료가 다섯개가 있으니까
count값이 5가 되어야 정상인데
member.dat라는 파일을 읽어들이는 과정에서
vi에디터가 조금 다르게 읽어들이는건지
count값이 6이 됩니다
(자료를 여섯개 받아들이고 member_list[5]에 쓰레기 값이 들어가더라구요)
깊은 내용을 잘 몰라서 이렇게 여쭈어봅니다..
(질문하는 제가 모자라서 질문도 참 힘들게 합니다;;)
잘 부탁드려요ㅠㅠ
Forums:
2가지 정도 의심가는 부분이 있습니다.
1. fscanf(fp, "%d%s%s", &m.member_id, &m.member_name, m.member_ssn);
MEMBER 구조체 선언이 어떻게 되어 있는지 보구싶구요.
제 생각에는
fscanf(fp, "%d%s%d", &m.member_id, m.member_name, &m.member_ssn);
이렇게 되어야 되지 않나 싶네요.
2. 환경 등의 문제
일단 Visual C++ 9.0과 gcc를 쓰셨다고 했는데.
그럼 하나는 Windows환경 하나는 UNIX환경에서 돌리셨나요? 'vi에디터가 조금 다르게 읽어들인다'는 말씀은 이해가 잘 안 감..
두 환경에서 동일한 file을 가지고 test를 해보셨는지 궁금하고요.
한번 file을 ftp binary mode로 다운로드 받으셔서.뭐 울트라에디터나 Visual Studio 같은 것으로..화일 내용을 직접 들여다 보시는 것도
좋은 방법입니다.
구조체 선언은
member_ssn은 char배열로 되어있습니다.
주민등록번호는 정수형으로 선언해서 연산에 쓰이는게 아니라서
일단 char배열로 선언했구요
환경에 대해서는
하나는 windows환경 하나는 UNIX환경에서 돌린게 맞습니다.
두환경에서 동일한 파일로 test를 했습니다.
마지막 인덱스 뒤에
혹시 공백문자가...
-------------
포탈이는 불사신
-------------
포탈이는 불사신
똑같은 파일을 두고 한지라..;;
공백문자는 확인해봤으나 없더라구요 : )
개행문자의 style 에
개행문자의 style 에 따라 좀 문제가 생길 수 있습니다. 일단 둘다 5 이상의 숫자가 나왔으므로
개행문자가 6회 나왔음을 알 수 있습니다. ( 0 ~ 5 )
마지막줄에 빈 carriage return 값이 있다는 가정하에 \r\n 과 \n 의 개행문자 해석차에 의해 os 별로 line 수를 다르게 볼 수 있습니다. ( 즉 eof 해석이 달라질 수 있습니다. )
파일의 제일 마지막행이 비어있다면 그 부분을 지우고 data의 맨 뒷자리가 실질적인 EOF 가 되게 하고 다시 실행해보시면 좀 더 확실할거 같습니다.
Neogeo - Future is Now.
Neogeo - Future is Now.
저도 개행문자 문제처럼 보입니다.
neogeo님의 의견처럼 저도 개행문자 문제처럼 보입니다.
그리고 한번 fopen(file_name, "rb") 처럼 "b"옵션 추가해서 시도해 보세요.
feof() 에 대한
feof() 에 대한 오해때문일 것 같은데요.
OTL
댓글 달기