将文件中的行添加到C中的数组中

时间:2015-01-15 05:01:41

标签: c string file lines

我正在尝试读取一个文件,每行都有一个名字,比如 吉姆 艾比 蒂莫西 并将每个名称存储在一个数组中的一个位置,以便我以后可以使用每个单独的名称。这是我的代码,但我不认为名称存储正确,因为如果我更改文件中名称的顺序,名称上的操作也会更改。操作取决于名称,而不是位置。

FILE *ptr_file; // pointer to file
char name[100];
size_t k=0;
ssize_t read;
char *line = NULL;

while ((read= getline(&line, &k, ptr_file))!=-1) 
            {
            fscanf(ptr_file, "%s", &name);
            printf("%s ",name);
            }

`我正在尝试用名称

做这样的事情
            for (i =0; i <length-1; i++) 
            //for the length of the string add each letter's value up
                {
                num = num + name [i];
                }

但是当我在列表中切换名称的位置时,num的值也会改变。

3 个答案:

答案 0 :(得分:0)

也许是这样的。在此代码中,我假设文件中的名称少于200个。你可以通过改变&#34;名称&#34;的大小来改变它。阵列

FILE *ptr_file; // pointer to file
char names[200][100];
size_t k=100;
size_t namesCount = 0;
size_t read;

while ((read= getline(names[namesCount], &k, ptr_file))!=-1) //reading name to names array
{
    printf("%s ",names[namesCount++]);//printf just readed name
}

答案 1 :(得分:0)

getline()在传递NULL指针时为您执行内存分配。 我已经对代码进行了评论以供解释。

#include <stdio.h>
#include <stdlib.h>
#define THRESHOLD (5)
int main(int argc,char** argv) {
  // the file containing the names (one in each line)
  char* fn = "test";
  // lets open the file (you should check the result!)
  FILE* file = fopen(fn,"r");
  // allocate memory for the array
  char** names = (char**)malloc(THRESHOLD * sizeof(char*));
  size_t i;  
  // set all the values to NULL
  for(i=0; i<THRESHOLD; i++) {
    names[i] = NULL;
  }
  // initialize the count
  size_t count = 0;
  // read all names until EOF and resize the array if needed
  while(getline(&names[count],&i,file) != EOF) {
    count++;
    if(count >= THRESHOLD) {
      names = (char**)realloc(names,(count+THRESHOLD)*sizeof(char*));
    }
  } 
  // resize (shrink) the array to the actual size                                                                                                                                                                                        
  names = (char**)realloc(names,count * sizeof(char*));
  // do something with the names (i just print them)
  for(i=0; i<count; i++) {
    printf("element %d, value %s",i,names[i]);
  }
  // you have to free the memory (allocated by getline)
  for(i=0; i<count; i++) {
    free(names[i]);
  }
  // you have to free memory (allocated by you)
  free(names);
  return 0;
}

答案 2 :(得分:0)

很难看出你的意思,但看起来你有两个基本的逻辑问题(忽略其他答案中突出显示的具体技术要点)。

1)代码使用getline读取一行,丢弃 line中的结果,然后立即使用fscanf从文件中读取更多文本。< / p>

2)fscanf 从文件中读取的每个名称都会覆盖 name缓冲区,该缓冲区是一个最多99个字符的字符串加上一个NULL终止符。< / p>

当您来处理缓冲区时,它将仅包含通过调用fscanf读取的姓氏,或者如果文件中有零行或一行则为无意义。此外,fscanf格式参数"%s"告诉fscanf读取第一个空格(包括制表符或换行符)字符的字符串,这对于简单名称可能很好,但如果你想要第一个和第二个字符则不行名。

这意味着更改文件的顺序可能会更改在读取文件的例程结束时name缓冲区中的名称。这就是num的价值不同的原因。