从c文件中读取行并将字符串放入数组中

时间:2014-10-22 07:22:10

标签: c arrays file-io

我正在尝试将c文件的每一行添加到数组中。 files.txt的内容是

first.c
second.c
third.c
fourth.c

我希望我的代码打印每一行,将行添加到我的数组,然后打印出我的数组中的每个条目。现在它正确地执行了第一部分,但它只是将第四部分添加到数组中。有人能告诉我我的代码有什么问题吗?

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int i=0;
    int numProgs=0;
    char* programs[50];
    char line[50];

    FILE *file;
    file = fopen("files.txt", "r");

    while(fgets(line, sizeof line, file)!=NULL) {
        //check to be sure reading correctly
        printf("%s", line);
        //add each filename into array of programs
        programs[i]=line; 
        i++;
        //count number of programs in file
        numProgs++;
    }

    //check to be sure going into array correctly 
    for (int j=0 ; j<numProgs+1; j++) {
        printf("\n%s", programs[j]);
    }

    fclose(file);
    return 0;
}

4 个答案:

答案 0 :(得分:1)

您需要更改

programs[i]=line; 

programs[i]=strdup(line); 

否则programs数组中的所有指针都将指向同一位置(即line)。

BTW:如果 files.txt 包含超过50行,您将遇到麻烦。

答案 1 :(得分:0)

你需要为每一行分配新的存储空间,否则你只有1行缓冲区来存储文件名,所以只显示最后一行,在while循环中执行此操作:

programs[i] = calloc(strlen(line)+1, 1);
strcpy(programs[i], line);

答案 2 :(得分:0)

  1. 不需要i并保存所有指向数组中行的指针,您必须使用strdup()。就这样做:

    programs[numProgs++] = strdup(line);

  2. 在第二个循环中,条件必须为j < numProgs

  3. 为while循环添加附加条件以防止写入通过数组的结尾:

    while(fgets(line, sizeof line, file)!=NULL && numProgs < 50)

答案 3 :(得分:0)

当声明char *programs[50]不是有效指针时。因此,您可以根据每个行大小为每个指针分配内存。所以,尝试这个..(这里我使用的是malloc&amp; strcpy)

    #include <stdio.h>
    #include <stdlib.h>
    #include<string.h>

    int main(void) {
    int i=0;
    int numProgs=0;
    char* programs[50];
    char line[50];

    FILE *file;
    file = fopen("files.txt", "r");

   while(fgets(line, sizeof line, file)!=NULL) {
   //check to be sure reading correctly
    printf("%s", line);
    //add each filename into array of programs
    programs[i]=malloc(sizeof(line));
    strcpy(programs[i],line);
    i++;
   //count number of programs in file
    numProgs++;
  }

  //check to be sure going into array correctly 
  for (int j=0 ; j<numProgs+1; j++) {
  printf("\n%s", programs[j]);
 }

 fclose(file);
 return 0;
}