2013-03-06 2 views
1

저는 여기 새로 왔으므로 도움이 필요합니다. :)이진 파일에서 고정 길이 읽기 (C)

나는 이진 파일을 쓰고 읽어야하는 프로그램을 만들고있다. 나는 그것에 강의를 추가해야합니다, 그들은 같은 모양 : 나는 char*를 사용하여 아무 문제없이 파일에 그것을 쓸 수

COURSECODE;COURSENAME;MAXAPPLICANTS;ACTUALAPPLICANTS; 

.

내 질문은 : 레코드를 고정 크기가 아닌 경우 구조체에서 어떻게 다시 읽어야합니까? (예 : coursename은 선형 대수학 또는 분석 일 수 있음 - 길이는 결정되지 않음) 또한 실제 신청자 수를 수정해야하며 어떻게 그 문자 위치와 현재 행을 찾을 수 있습니까?

나는 아이디어에 만족할 것이고, 나는 모든 소스 코드에 대해서도 감사 할 것이다. 나는 C++로 프로그래밍했고, C는 나에게 힘든 계단이다.

미리 감사드립니다.

+1

지금까지 무엇을 알아 냈습니까? –

+1

예제가 바이너리 파일이 아닌 텍스트 파일 인 것 같습니다. – nos

+0

왜 이진 파일입니까? –

답변

2

귀하의 구조가

처럼 보인다
struct student { 
char *coursecode; 
char *coursename; 
char *max_applicants; 
char *actual_applicants; 
}; 

구조체에 다른 멤버를 추가하기 만하면 전체 구조체 크기가 저장되는 int size이라고 말하면됩니다.

당신이 다음 기록에 얼마나 많은 문자를 참조 레코드의 첫 번째 4 bytes 당신이 얻을 것이다 완전한 크기를 읽어 바이너리 파일에서 읽을 때마다, 그 정도 및 토큰 화 문자열 ;에 의해 당신이 당신의 기록을 찾을 수 있습니다 읽어 보시기 바랍니다.

+0

대단히 감사합니다! – Peter

0

종료 문자 없이는 불가능합니다.

일부 문자를 분리하여 데이터를 분리하면 가능합니다.

예를 들어 3 개의 문자열을 \ 0으로 구분할 수 있습니다. 그래서 \ 0까지 3 번 읽습니다.

당신은 char* 버퍼에 파일을 읽을 수
0

후 교체 \0 (문자열 종료 문자) 그리고 마지막으로 당신은 당신의 구조체에 필드의 시작의 포인터를 가지고있는 모든 ; :

struct student { 
    char *coursecode; 
    char *coursename; 
    char *max_applicants; 
    char *actual_applicants; 
}; 

당신은 수도를 먼저 숫자 필드를 atoi으로 파싱하고 싶습니다.

0

조언 # 1 : 당신이 힌디어이고 다시 태어났다면 C를 배우기 시작하고 C++로 전환하십시오.

충고 # 2 : 올바르게 이해하면 연속으로 4 개의 문자열이 세미콜론으로 구분됩니다. 그런 다음 각 행을 분할하고 구조체의 배열에 파일의 내용을 넣어 strtok_r()을 사용할 수 있습니다 (명확성을 위해 생략 확인 모든 오류,하지만 당신은 확실히 몇 가지가 있어야합니다) :

typedef struct { 
    char *code; 
    char *name; 
    int max_appl; 
    int cur_appl; 
} Course; 

char buf[1024]; 

FILE *f = fopen("courses.txt", "r"); 

size_t size = 0; 
size_t allocsize = 8; 
Course *c = malloc(allocsize * sizeof(*c)); 

char *end; 

while (fgets(buf, sizeof(buf), f) != NULL) { 
    if (size >= allocsize) { 
     allocsize <<= 1; 
     c = realloc(c, allocsize * sizeof(*c)); 
    } 

    c[size].code = strdup(strtok_r(buf, ";", &end)); 
    c[size].name = strdup(strtok_r(NULL, ";", &end)); 
    c[size].max_appl = strtol(strtok_r(NULL, ";", &end), NULL, 10); 
    c[size].cur_appl = strtol(strtok_r(NULL, "\n", &end), NULL, 10); 

    size++; 
} 

int i; 
for (i = 0; i < size; i++) { 
    Course *p = c + i; 
    printf("%s\n%s\n%d\n%d\n\n", p->code, p->name, p->max_appl, p->cur_appl); 
    free(p->code); 
    free(p->name); 
} 

free(c); 
fclose(f); 
+0

코드에서 strtok을 사용하지만 strtok_r을 사용하지 않습니다. 귀하의 예제에서 strtok_r도 사용하십시오. – fuz

+0

@FUZxxl 분명히, 그것은하지 않습니다 ... : P –

+0

새 버전을 만들지 못할 정도로 빨리 볼 수 없거나 수정했습니다. – fuz

관련 문제