如何在C语言中使用stdio.h读取文件单词?

问题描述:

我是C新手,没有分段故障,我无法完全掌握它。如何在C语言中使用stdio.h读取文件单词?

这里是我的想法至今:

#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不是你想要的。在你遵循克里斯的建议并且将单词指向一个实际的缓冲区之后,你应该做一些像[i ++] = c的事情; (或者,通常* word ++ = c并且有另一个指针保持跟踪缓冲区的开始) – 2011-03-06 20:48:37

在你nextWord功能,你永远不初始化局部变量word在什么点,所以当你试图写入所指向的内存strcat,你获得段错误。

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

  • 使用(大)固定大小的缓冲区堆栈上举行的话,你读它,然后将其复制到适当大小的malloc分配区域,当你把它返还。如果遇到对于固定大小的缓冲区来说太大的单词,会出现问题。

  • 分配一个小块来读取单词,并跟踪读取字符时使用了多少。块填满后,重新分配它变大。

或者你也可以在你的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变量分配单词。 不要忘记冲洗缓冲区变量

+0

不要使用fscanf来将长度未知的字符串读入固定大小的缓冲区。你想使用一个函数来指定缓冲区的大小。 – dreamlax 2011-03-06 21:29:08

+0

-1:由于fscanf返回匹配的项目数(在本例中通常总是1),而不是读取的任何东西的长度,所以这几乎总是会崩溃。另外,如果该单词对于缓冲区来说太长,则会发生不好的事情。 – 2011-03-06 22:55:51