如何在读取C文件的同时创建一个具有行数的变量?
所以,我需要一个代码来读取一个TXT文件,每行包含5个内容,并将每行的值存储在一个变量中。但是TXT中的行数会有所不同。所以我想做这样的事情:如何在读取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将具有文件的行数。但问题是要存储
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