본문 바로가기

공부

C 언어 - 파일을 load 할 때 주의할 점

C 언어 프로젝트를 하면서 어떤 저장된 파일을 불러올 경우 주의할 점이다.

Kim#He was idiot#C:\\Document
Tim#He was not#D:\\File
Tina#She was pretty#C:\\Picture

이렇게 되어 있었던 경우라고 하고 #을 기준으로 tokenizing을 한다고 가정한다. 

1
2
3
4
5
6
7
8
9
10
11
12
void load(FILE *fp) {
    char buffer[BUFFER_LENGTH];
    char *name, *title, *path, *context;
 
    while (1) {
        if (read_line(stdin, buffer, BUFFER_LENGTH) <= 0)
            break;
        name = strtok_s(buffer, "#"&context);
        title = strtok_s(NULL"#"&context);
        path = strtok_s(NULL"#"&context);
    }
}
cs


이렇게 하면?? 큰일난다. 왤까... 모범 답안을 보면 이해가 갈 것이다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void load(FILE *fp) {
    char buffer[BUFFER_LENGTH];
    char *name, *title, *path, *context;
 
    while (1) {
        if (read_line(fp, buffer, BUFFER_LENGTH) <= 0)
            break;
        name = strtok_s(buffer, "#"&context);
        if (strcmp(name, " "== 0)
            name = NULL;
        else
            name = _strdup(name);
 
        title = strtok_s(NULL"#"&context);
        if (strcmp(title, " "== 0)
            title = NULL;
        else
            title = _strdup(title);
 
        path = strtok_s(NULL"#"&context);
        if (strcmp(path, " "== 0)
            path = NULL;
        else
            path = _strdup(path);
 
        printf("%s %s %s\n", name, title, path);
    
    }
}
cs


while문을 계속 돌기 때문에, char *name, *title, *path 이 친구들이 계속해서 쓰이게 될 것이고, 이 변수들이 배열 포인터이기 때문에 그 값이 계속해서 바뀌게 된다. 그래서 매번 while문을 돌 때마다 strdup를 이용해서 복사를 해 주어야 한다.