我如何在数组中保存这些?

时间:2015-11-20 23:18:25

标签: c arrays file

我有一个包含这些原始文本的文本文件:

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);
   }

2 个答案:

答案 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);
}