2010-10-14 105 views
2

我想将文本文件读入字符串数组,并能够通过循环访问数组内容。我有的代码允许我只存储文本文件的最后一行而不是整个文件;我哪里错了?如何将文本文件中的字符串存储到数组中C

#define MAX 10000 

int main (int argc, char *argv[]) 
{ 
    FILE *fp; 
    char str[MAX]; 
    char *x[MAX]; 
    int i =0; 
    char y[MAX]; 

    if((fp = fopen("550.txt", "r"))==NULL) { 
    printf("Cannot open file.\n"); 
    exit(1);} 

    while(!feof(fp)) { 
     while(fgets(str, sizeof str, fp)) { 
      x[i]= str; 
      printf("%s", str); 
      printf("%s", *(x+i)); 
      i++; 
     } 
    } 


for(i=0;i<100;i++){ 
    printf("%s", *(x+i)); 
} 

    fclose(fp); 

    return 0; 
} 
+0

不要使用FEOF()来控制回路cond.http://c-faq.com/stdio/feof.html – Nyan 2010-10-14 18:27:51

回答

3

你只分配一个字符串数组str。在循环的每次迭代中,您只需简单地覆盖str。分配x[i] = str指针的值分配给strx[i]。您会注意到,阵列中的每个成员x都指向相同的缓冲区str在循环结束时。您需要创建多个缓冲区。要做到这一点

的一种方式是使用#define LINES 100定义的最大行数,然后申报x如下

char x[LINES][MAX]; 

,然后执行strcpy在每次迭代:

while(fgets(str, sizeof str, fp)) { 
    strcpy(x[i], str); 
    printf("%s", str); 
    printf("%s", *(x+i)); 
    i++; 
} 

注您应该考虑使用strncpy方法而不是strcpy并检查返回值以确保缓冲区不会溢出。

+0

你肯定与fgets不会零终止长的输入缓冲区? – Nyan 2010-10-14 18:29:21

+1

为什么这个答案downvoted? – 2010-10-14 20:36:12

1

你需要让每个字符串的副本:

x[i] = strdup(str); 

你此刻在做什么是使每个x[i]指向同一个缓冲区,其中将包含该文件一旦你的最后一行已经完成了。

(注:你还需要free()所有你strdup()创建x[i]字符串)。

+0

strdup不是ANSI C – user411313 2010-10-14 19:46:56

0

你是不是stroing你在任何地方阅读行。它被缓冲到str中,但是你用下一行覆盖它。使用strdup。

x[i] = strdup(str); 
相关问题