如何在C中使用stdio.h逐字读取文件?

时间:2011-03-06 20:02:23

标签: c string word stdio

我是C的新手,如果没有分段错误,我就无法完成它。

到目前为止,这是我的想法:

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

2 个答案:

答案 0 :(得分:1)

nextWord函数中,您永远不会初始化局部变量word以指向任何内容,因此当您尝试使用strcat写入指向的内存时,您将得到一个段错误。

您需要分配内存来存储您要阅读的单词。问题是,你不知道这个词有多大,所以你不知道要分配多少空间。有许多可能的方法:

  • 在堆栈中使用(大)固定大小的缓冲区来保存单词,然后在返回时将其复制到适当大小的malloc区域。如果遇到对于固定大小缓冲区来说太大的单词,则会出现问题。

  • 分配一个小块来读取单词,并跟踪读取字符时使用的数量。当块已满时,将其重新分配为更大。

答案 1 :(得分:-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,则使用字符数分配它,否则您将使用 previous_size 变量分配单词。 不要忘记刷新缓冲区变量