从C中的文本文件逐字阅读

时间:2014-10-13 21:58:23

标签: c char fopen fgetc file-read

我是C的新手。我正在尝试从包含大量非字母字符的文件中读取单词。我的输入文件看起来像这个%tOm12%64ToMmy%^$$6,我想首先读取tom然后将tom放入我的数据结构中然后读取tommy并将其放在我的数据结构中全部用小写字母表示。这是我迄今为止所尝试过的。我的所有其他代码都工作,因为我手动将参数发送到方法,没有错误。这是我试图从文件中读取的文字。一个单词最多可以包含100个字符。有人可以帮助我理解逻辑和可能的代码。我很失落。谢谢你!

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

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

这是@BLUEPIXY答案的简化。它还检查word []

的数组边界
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);
}