我有一个包含时间开始和时间结束元组的链表。在每个列表中,这些元组不重叠。 现在,我希望将它们存储在一个文件中,而不是将这些元组放在列表中。 所以列表现在应该是一个文件。为了对这些文件进行排序并浏览每个文件,我必须知道文件旁边的文件。换句话说,如何指向下一个文件,例如在链表中。
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;
所以我想要像链接文件一样的东西。有什么建议吗?
答案 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');
}