我有一个包含这些原始文本的文本文件:
123#john#smith
153#jane#smith
我将它们拆分并写成这样:
123
john
smith
153
..
现在我想把它们放在一个二维数组中。我该怎么办?
void read_file()
{
FILE *file;
char name[100];
char *p;
file=fopen("names.txt","r");
while(!feof(file))
{
fscanf(file,"%s\n",name);
p= strtok(name," #");
while(p!=NULL)
{
printf("%s\n",p);
p= strtok(NULL, " #");
}
}
fclose(file);
}
答案 0 :(得分:0)
像@jeff carey所说,你可以使用struct。因为你想操纵不同类型的数据。 这是一个例子:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* The struct */
typedef struct
{
int number;
char* firstName;
char* lastName;
} Name;
int main(void)
{
FILE *file;
char buffer[100];
char *p;
int i;
Name myNames[2];
file = fopen("names.txt","r");
for(i = 0; i < 2; i++)
{
fscanf(file,"%s\n",buffer);
p = strtok(buffer," #");
myNames[i].number = atoi(p);
p = strtok(NULL," #");
myNames[i].firstName = strdup(p);
p = strtok(NULL," #");
myNames[i].lastName = strdup(p);
}
fclose(file);
/* Printing the data. */
for(i = 0; i < 2; i++)
{
printf("Number: %d. First Name: %s. Last Name: %s.\n", myNames[i].number, myNames[i].firstName, myNames[i].lastName);
}
/* strdup allocates memory on heap, and you should free it. */
for(i = 0; i < 2; i++)
{
free(myNames[i].firstName);
free(myNames[i].lastName);
}
return 0;
}
答案 1 :(得分:0)
您在文件中有一个数组/值列表,其中包含分隔符(&#39;#&#39;)文本,
123#john#smith
153#jane#smith
173#joe#doe
...
您可以制作一个字符数组数组来保存每个字段/列,假设您事先知道列的大小。但是你可能无法确定尺寸,这无论如何真的不是最好的方式。你可以定义一个结构,但同样的问题。
因此,为文件的每一行定义一个char *数组,您可以将指针指向数据,也可以使用strdup为数据分配新的缓冲区。
#define MAXFIELDS (20) /*pick a sane value*/
char** /*return an array of pointers to char, char* fields[] */
parse_line(char* line,int* count)
{
int ndx;
char* p=line;
char* element;
char** fields = malloc(MAXFIELDS*sizeof(char*));
for( ndx=0; element = strtok(p,"#"); ++ndx ) {
p=NULL;
/*either point directly at (a copy of) the string*/
fields[ndx] = element;
/*or use strdup to make a copy*/
fields[ndx] = strdup(element);
}
/*ndx contains number of elements*/
if(count) *count=ndx;
return(fields);
}
您可以定义要从文件中读取的最大行数,也可以使用链接列表(为简单起见,使用固定长度数组)。
#define MAXROWS (100) /*pick a sane value*/
char** rows[MAXROWS];
void read_file()
{
FILE *file;
char name[100];
char *p;
int ndx=0; //rowcount
int fieldcount;
file=fopen("names.txt","r");
while(!feof(file)) {
fscanf(file,"%s\n",name);
/* either make a copy of the line here, or copy elements inside parse_line*/
p = strdup(name);
rows[ndx++] = parse_line(p,&fieldcount);
}
fclose(file);
}