C언어에서 바이너리 파일을 읽어올때 질문입니다;
글쓴이: mtg1 / 작성시간: 일, 2010/04/18 - 7:01오후
파일의 구성은...
필드전체길이|필드1|필드2길이|필드2|필드3|필드4
이런 식으로 쓰여진 것이고요,
필드1은 int, 필드2는 char[20](20은 최대 길이입니다),
필드 3은 float, 필드 4는 char입니다.=ㅅ=;
길이 값은 short 형식이고요;
이걸 불러온다고 할 때 어떤 식으로 해야할까요;
일단 제가 짠 것은..
void load(FI fi[]){ FILE *fp1, *fp2; char separators[]="|\n"; int a=0; char data[100]; int k=0,l=0;//인원,필드,데이터 char *tok; if((fp1=fopen("seq(4000).dat","rb"))==NULL){ printf("존재하지 않는 파일입니다.\n"); exit(1); } if((fp2=fopen("input.txt","wb"))==NULL){ printf("파일오류\n"); exit(1); } while(fgets(data,sizeof(FI),fp1) != NULL ){ if(tok = strtok(data, separators))fi[z].l=(short)atoi(tok); if ( tok=strtok(NULL,separators) ) fi[z].num=atoi(tok); if ( tok=strtok(NULL,separators) ) fi[z].len=(short)atoi(tok); if ( tok=strtok(NULL,separators) ) strcpy(fi[z].name, tok); if ( tok=strtok(NULL,separators) ) fi[z].f = (float)atof(tok); if ( tok=strtok(NULL,separators) ) fi[z].s = *tok; if(fi[z].l>0){ fprintf(fp2, "%d\n", fi[z].num); z++; } if( z >= MAX) break; } j=z; //printf("%d\n",z); fclose(fp1); fclose(fp2); }
이런 식으로 짰는데, 읽어오는 과정에서 이상한 값들만 불러와지네요;;
도와주세요;;
Forums:
바이너리로
바이너리로 저장하셨다면 저장할 때 사용한 구조체로 구조체 변수를 선언다음 바로 그 구조체 변수에다 Read하면 끝나는데요.
굳이 위 코드처럼 진행해야하는 이유가 있나요?
아, 그런가요?
아직 C언어에 대해서 잘 모르다보니 저런 식으로 진행한 것도 있지요;;(ㄷㄷ;)
어떤 함수를 써야하는지도 잘 모르겠고..(ㄷㄷ;;)
일단...
이런 형태의 구조체에 넣어야하는데, char의 길이가 가변이라서 그걸 어떻게 처리해야하고,
이걸...최대 25000개 넣을 수 있게 했는데, 그보다 더 큰게 들어올 수 있어서
l(전체길이)가 다른 값이면 넣지 않고 해야하거든요;;
char name[20]; 이..
char name[20]; 이.. 20바이트로 고정이잖아요. ㅡ.ㅡa
가변이 아니잖아요?
파일에 쓸 때
파일에 쓸 때 가변길이로 쓰는 거라면 문제가 있을 수 있겠지만
위의 구조체의 name에 문자열을 넣고 구조체를 파일에 써버리는 것이라면
읽을 때 문제는 없습니다
입력 파일의 내용이 문자열 형식인가요? 바이너리 형식인가요?
입력 파일의 내용이 일반 text형식의 문자열로 되어있다면 fgets를 사용하셔도 별 문제는 없습니다만
바이너리 형식일 경우 fgets로 내용을 읽어오면 문제가 생길 수도 있습니다.
댓글 달기