2011-03-06 7 views
0

저는 C를 처음 접했기 때문에 세분화 오류가 발생하지 않았으므로이를 얻을 수 없습니다. 여기 C에서 stdio.h를 사용하여 단어별로 파일 단어를 읽으려면 어떻게해야합니까?

지금까지 내 생각 :

nextWord 기능에
#include<stdio.h> 
#include<string.h> 

char *nextWord(FILE *stream) { 
    char *word; 
    char c; 

    while ((c = (char)fgetc(stream)) != ' ' && c != '\n' && c != '\0') { 
     strcat(word, &c); 
    } 

    return word; 
} 

int main() { 
    FILE *f; 
    f = fopen("testppm.ppm", "r"); 
    char *word; 
    word = nextWord(f); 
    printf("%s",word); 
} 
+0

strcat는 원하는 것이 아닙니다. Chris의 조언을 따르고 실제 버퍼를 가리키는 단어를 가지고 나면 단어 [i ++] = c; (또는 일반적으로 * word ++ = c이고 버퍼의 시작을 추적하는 또 다른 포인터가 있습니다.) –

답변

1

, 당신은 결코 아무것도 가리 키도록 로컬 변수 word를 초기화하지, 그래서 당신은 쓸 때 뾰족한-에서 메모리 strcat로, segfault를 얻으십시오.

읽으려는 단어를 저장하기 위해 메모리를 할당해야합니다. 문제는 그 단어의 크기가 얼마나 될지 모르기 때문에 할당 할 공간이 얼마나되는지 모른다는 것입니다. 가능한 방법 중 하나입니다 :

  • 당신이 그것을 읽을 때 단어를 개최 스택에 (대형) 고정 크기 버퍼를 사용하고 적절한 크기의 malloc이 영역에 복사 할 때를 반환. 고정 크기 버퍼에 비해 너무 큰 단어를 발견하면 문제가 발생합니다.

  • 단어를 읽는 작은 블록을 할당하고 문자를 읽을 때 사용되는 양을 추적하십시오. 블록이 꽉 찼을 때 더 커야합니다.

-1

또는 while 루프에서 fscanf 함수를 사용할 수도 있습니다.

char *nextWord(FILE *stream) { 
    char *buffer[124], *word; 
    int previous_size = 0; 

    while(!feof(!stream)){ 
     int n = fscanf(file, "%s", buffer); 
     if(word == NULL){ 
      word = malloc(sizeof(char)*n) 
     } else { 
      realloc(word, n + previous_size); 
     } 
     strncat(word, buffer, strlen(buffer) - 1);   
     previous_size = n; 
     } 
     return word; 

} 

약간의 설명. fscanf 함수는 읽은 문자 수를 반환합니다. 그래서 내가하는 첫 번째 일은 그 가치를 저장하는 것입니다. 단어이 NULL이면 문자 수와 함께 할당합니다. 그렇지 않으면 이전 크기 변수로 단어를 할당합니다. 버퍼를 플러시하는 것을 잊지 마세요. 변수

+0

알려지지 않은 길이의 문자열을 고정 크기 버퍼로 읽는 데 fscanf를 사용하지 마십시오. 버퍼의 크기를 지정할 수있는 함수를 사용하려고합니다. – dreamlax

+0

-1 : fscanf는 일치하는 항목 수 (이 예제에서는 일반적으로 항상 1)를 반환하고 읽는 길이는 반환하지 않으므로이 방법은 거의 항상 충돌합니다. 또한 단어가 버퍼에 비해 너무 길면 나쁜 일이 일어납니다. –

관련 문제