2014-10-13 3 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

Вам не хватает кода для установки конечного нуля символ 'word'. Добавьте' word [counter] = '\ 0'; 'перед сбросом' counter'. –

+0

Дерево @CIsForCoocckies - это глобальная переменная, и я сделал это, но я пытаюсь сделать так, чтобы он читал первый слово, которое является томом, а затем вставлять его в дерево, а затем читать второе слово и вставлять его в дерево, но после того, как я вставляю тома, слово не очищается, поэтому как бы я это сделал, чтобы он очистил массив, а затем ввел новый слово в массив символов той же длины 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

Он работает! Но не могли бы вы объяснить, что именно вы сделали? Я понимаю метод чтения, но потерял метод getWord. Если возможно, вы можете объяснить это? Я новичок в программировании на С, и я хочу убедиться, что я это понимаю! – code4life

+0

@ code4life 1) Существует необходимость разграничения перед словом, чтобы пропустить 2). При выходе из EOF необходимо вывести символ во время хранения. 3) «слово» необходимо для завершения символа NUL. 4) Возможно, для операции вставки требуется клонирование строк. – BLUEPIXY

1

Это упрощение ответа @BLUEPIXY «s. Он также проверяет границы массива для слова []

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); 
}