2014-10-13 7 views
1

저는 C가 매우 새롭습니다. 나는 알파벳 문자가 많이 포함 된 파일에서 단어를 읽으려고합니다. 내 입력 파일은 %tOm12%64ToMmy%^$$6과 비슷하게 보이며 먼저 tom을 읽고 내 데이터 구조에 tom을 넣고 tommy를 읽고 내 데이터 구조에 모두 소문자로 넣으려고합니다. 이것은 지금까지 시도한 것입니다. 모든 다른 코드는 수동으로 매개 변수를 메서드에 보냈으므로 오류가 없습니다. 이것은 파일에서 단어를 읽으려고 시도한 것입니다. 단어는 최대 100 자까지 가능합니다. 누군가가 논리와 아마도이 코드를 이해하도록 도와 줄 수 있습니까? 나는 매우 잃어버린 것입니다. 감사합니다!C의 텍스트 파일에서 단어 단위로 단어 읽기

void read(FILE *fp) 
{ 
    FILE *fp1 = fp; 
    char word[100]; 
    int x; 
    int counter = 0; 

    while ((x = fgetc(fp1)) != EOF) 
    { 
    if (isalpha(x) == 0) 
    { 
     insert(&tree,word); 
     counter = 0; 
    } 
    if (isalpha(x) != 0) 
    { 
     tolower(x); 
     word[counter] = x; 
     counter++; 
    } 
    } 
    rewind(fp1); 
    fclose(fp1); 
} 
+1

트리 변수는 여기에 정의되어 있지 않으므로 설명을해주어야합니다. 두 번째 문자 배열은 '\ 0'으로 끝나야하므로 "char word [101]"로 만들고 "word [++ counter] = '\ 0'로 끝내야합니다. – CIsForCookies

+2

종료 널 '단어'의 문자를 추가합니다. 'counter'를 재설정하기 전에'word 'counter'= '\ 0';을 추가하십시오. –

+0

@CIsForCoocckies 트리는 전역 변수입니다.하지만 그렇게했습니다. Tom이라는 단어를 트리에 삽입 한 다음 두 번째 단어를 읽고 트리에 삽입합니다.하지만 tom을 삽입하면 단어가 지워지지 않습니다. 그래서 어떻게하면 배열을 지우고 새로운 같은 100 길이의 문자 배열에 단어 – code4life

답변

2
char *getWord(FILE *fp){ 
    char word[100]; 
    int ch, i=0; 

    while(EOF!=(ch=fgetc(fp)) && !isalpha(ch)) 
     ;//skip 
    if(ch == EOF) 
     return NULL; 
    do{ 
     word[i++] = tolower(ch); 
    }while(EOF!=(ch=fgetc(fp)) && isalpha(ch)); 

    word[i]='\0'; 
    return strdup(word); 
} 
void read(FILE *fp){ 
    char *word; 
    while(word=getWord(fp)){ 
     insert(&tree, word); 
    } 
    //rewind(fp1); 
    fclose(fp); 
} 
+3

그것은 작동합니다! 하지만 네가 정확히 한 일을 설명해 줄 수 있니? 나는 read 메소드를 이해하지만 getWord 메소드에서 잃어버린 일종의 종류이다. 가능한 경우 설명해주십시오. 나는 C 프로그래밍에 익숙하지 않고 그것을 이해하고 싶다! – code4life

+0

@ code4life 1) 건너 뛰려면 단어 앞에 구분 기호를 사용해야합니다. 2) EOF에 도달하면 저장 중에 문자를 출력해야합니다. 3) '단어'는 NUL 문자를 종결하는 데 필요합니다. 4) 아마도 삽입 작업을 위해 문자열 복제가 필요합니다. – BLUEPIXY

1

이 은 @BLUEPIXY의 대답의 단순화이다. 또한 단어 []에 대한 배열 경계를 확인합니다

char *getword(FILE *fp) 
{ 
    char word[100]; 
    int ch; 
    size_t idx ; 

    for (idx=0; idx < sizeof word -1;) { 
     ch = fgetc(fp); 
     if (ch == EOF) break; 
     if (!isalpha(ch)) { 
      if (!idx) continue; // Nothing read yet; skip this character 
      else break; // we are beyond the current word 
      } 
     word[idx++] = tolower(ch); 
     } 
    if (!idx) return NULL; // No characters were successfully read 
    word[idx] = '\0'; 
    return strdup(word); 
}