链接文件而不是链接列表

时间:2016-02-05 15:57:12

标签: c list file memory linked-list

我有一个包含时间开始和时间结束元组的链表。在每个列表中,这些元组不重叠。 现在,我希望将它们存储在一个文件中,而不是将这些元组放在列表中。 所以列表现在应该是一个文件。为了对这些文件进行排序并浏览每个文件,我必须知道文件旁边的文件。换句话说,如何指向下一个文件,例如在链表中。

    typedef struct List
{
  struct List *next;


} List;

但我不想要这样的东西,我首先创建链表,然后将每个列表放在一个文件中,因为我想逃避内存使用。喜欢这里

static void create_files(List* first){

List* tmp = first;
int partition_num = 1;

while(tmp != NULL){
    char filename[29];
    sprintf(filename, "Partitions%d/Partition%d.txt",partition_folder, partition_num);
    File* partition;
    partition= fopen(filename, "w");


    while(tmp->head != NIL){

        fprintf(partition,"[%d, %d) \n",ts,te);
        tmp->head= tmp->head->next;

    }
    list_num++;
    tmp=tmp->next;

}

更像这样的东西

File* firstfile;
{ //adding data to this file}
File* second_file;
{ // adding data to this file}
firstfile ->next = second file;

所以我想要像链接文件一样的东西。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

像这样定义

struct FileLinkedList
{
    FILE * f;
    FileNode * next;
}

但是你需要在文件中包含一些元数据,例如文件中的第一行是下一个文件的文件名或0结束

<强> A.TXT

B.txt
This is the first Node in the FileLinkedList

<强> B.txt

0
This is the last Node in the FileLinkedList

<强>列表

{ [A.txt] }--> { [B.txt] }--> 0

然后定义函数以为您生成列表

FileLinkedList* createFileLinkedList (char* file_name)
{
    char next_file[255];
    FileLinkedList* n,head = (FileLinkedList*)malloc(sizeof(FileLinkedList));
    head->f = fopen(file_name);
    next_file = get_meta(head->f);
    init_reader(head->f);

    n = head;
    while (strcmp("0",next_file) != 0)
    {
        n->next = (FileLinkedList*)malloc(sizeof(FileLinkedList));
        n = n->next;
        n->f = fopen(next_file);
        next_file = get_meta(head->f);
        init_reader(head->f);
    }

    return head;
}

get_meta在哪里读取我们需要的第一行

char* get_meta (FILE* f)
{
    char* m = (char*)malloc(sizeof(char)*255);
    rewind(f);
    fgets(m, sizeof(m), f);
    return m;
}

init_reader是将文件光标放在元数据部分

之后
void init_reader (FILE* f)
{
    rewind(f);
    while(fgetc(f) != '\n');
}