如何在读取C文件的同时创建一个具有行数的变量?

如何在读取C文件的同时创建一个具有行数的变量?,c,C,所以,我需要一个代码来读取一个TXT文件,每行包含5个内容,并将每行的值存储在一个变量中。但是TXT中的行数会有所不同。所以我想做这样的事情: int counter=0; char nome="TXT NAME.txt"; FILE *f = fopen(NAME,"r"); do{ if(!feof(p)) counter++; }while(!feof(f)); fclose(f) int X[counter][5]; 因此,当这样声明时,X将具有文件的行数。但问题是要存储

所以,我需要一个代码来读取一个TXT文件,每行包含5个内容,并将每行的值存储在一个变量中。但是TXT中的行数会有所不同。所以我想做这样的事情:

int counter=0;
char nome="TXT NAME.txt";
 FILE *f = fopen(NAME,"r");
 do{
 if(!feof(p))
 counter++;
}while(!feof(f)); 
 fclose(f)
 int X[counter][5];
因此,当这样声明时,X将具有文件的行数。但问题是要存储这些值,我需要再次打开并读取该文件。在声明变量时是否有保存值的方法,这样我就不需要打开两次

如何读取C语言中的文件,同时创建具有行数的变量?
在声明变量时是否有保存值的方法,这样我就不需要打开两次

一种很好的方法是使用
fgets()
一次读取一行,使用
strdup()复制缓冲区,并保存在创建的链接列表中

一些伪代码让您继续

f = open file
exit if unable to open
line_count = 0;
list = LL_Create()
char buffer[100];
while (fgets(buffer, sizeof buffer, f)) {
  Maybe special handling here to deal with lines longer than 100
  char *s = strdup(buffer);
  LL_Append(list, s);
  line_count++;
}
fclose(f);

// Use the link-list of strings

// When done
while !LL_Empty(list)
  s = LL_Pop(list)
  free(s);

LL_Destroy(list)

您可以使用realloc逐步扩展您的“阵列”

但一种更简单的方法是使用链表,这样,当您读取文件时,链表就会增长

typedef struct 
{
  char data[5];
  Line* next;
} Line;

Line* first = NULL;
Line* last = NULL; 

char line[128];
while (fgets(line, sizeof(line), f)
{
  Line* tmp = malloc(sizeof(Line));
  memcpy(tmp->data,line,5);
  tmp->next = NULL;

  if (first == NULL)
  {
    first = last = tmp;
  }
  else
  {
    last->next = tmp;
    last = tmp;
  }
}
现在我们来看看台词

for(Line* p = first; p != NULL; p = p->next)
{
   p->data ...
}

除了上面提到的
feof
业务之外,您甚至没有从文件中读取任何内容。您是否能够准确地计算出使用该代码的行数?我对此表示怀疑。在我看来像是一个无限循环。变量
p
是什么?简短回答:是的。读取文件的一行。保存它。读下一行。继续,直到到达文件末尾<代码>手动realloc