2012-03-12 116 views
0

在這裏,我有一個目錄,其中有一些文件。想要填充元數據的結構

我想填充這個文件在一個結構中的所有信息。

我有兩個結構如下。

struct files { 

    char *file_name; 
    int file_size; 
}; 

typedef struct file_header { 

    int file_count; 
    struct files file[variable as per number of files]; 
} metadata; 

我想做一個頭,其中包含有關這些文件的所有信息。

像如果我有3個文件比我想在file_count = 3這樣的結構這樣的結構,我該如何分配第二個變量值?並希望按文件存儲文件名和文件大小。

我想這樣

file_count = 3 
file[0].file_name = "a.txt" 
file[0].file_size = 1024 
file[1].file_name = "b.txt" 
file[1].file_size = 818 
file[2].file_name = "c.txt" 
file[2].file_size = 452 

我對文件名和文件大小,但所有的邏輯文件結構我怎麼能在這種結構中填充這些東西?

代碼:

#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <dirent.h> 
#include <string.h> 



char path[1024] = "/home/test/main/Integration/testing/package_DIR"; 

//int count = 5; 

struct files { 

    char *file_name; 
    int file_size; 
}; 

typedef struct file_header { 

    int file_count; 
    struct files file[5]; 
} metadata; 


metadata *create_header(); 

int main() { 
    FILE *file = fopen("/home/test/main/Integration/testing/file.txt", "w"); 
    metadata *header; 
    header = create_header(); 
    if(header != NULL) 
    { 
     printf("size of Header is %d\n",sizeof(metadata)); 
    } 

    if (file != NULL) { 

     if (fwrite(&header, sizeof(metadata), 1, file) < 1) { 
      puts("short count on fwrite"); 
     } 
     fclose(file); 
    } 
    file = fopen("/home/test/main/Integration/testing/file.txt", "rb"); 
    if (file != NULL) { 
     metadata header = { 0 }; 
     if (fread(&header, sizeof(header), 1, file) < 1) { 
      puts("short count on fread"); 
     } 
     fclose(file); 
     printf("File Name = %s\n", header.file[0].file_name); 
     printf("File count = %d\n", header.file_count); 
     printf("File Size = %d\n", header.file[0].file_size); 
    } 
    return 0; 
} 

metadata *create_header() 
{ 
    int file_count = 0; 
    DIR * dirp; 
    struct dirent * entry; 
    dirp = opendir(path); 
    metadata *header = (metadata *)malloc(sizeof(metadata)); 
    while ((entry = readdir(dirp)) != NULL) { 
     if (entry->d_type == DT_REG) { /* If the entry is a regular file */ 

      header->file[file_count].file_name = (char *)malloc(sizeof(char)*strlen(entry->d_name)); 
      strcpy(header->file[file_count].file_name,entry->d_name); 
      //Put static but i have logic for this i will apply later. 
      header->file[file_count].file_size = 10; 
      file_count++; 

     } 
    } 
    header->file_count = file_count; 
    closedir(dirp); 
    //printf("File Count : %d\n", file_count); 
    return header; 
} 

輸出:

size of Header is 88 
ile Name = �~8 
File count = 29205120 
File Size = -586425488 

它顯示不同的輸出。所以這裏有什麼問題?

+2

這裏的問題具體是什麼? – 2012-03-12 11:11:10

+1

可能重複的[Create Customize Header(metadata)for files](http://stackoverflow.com/questions/9664536/create-customize-headermetadata-for-files) – 2012-03-12 11:15:59

+0

我可以通過鏈表實現這件事嗎? – user1089679 2012-03-12 11:26:29

回答

0

別的不說,你在一個指針變量使用sizeof,但似乎認爲給你的對象的大小被指出至。它沒有。要做到這一點,使用星號操作人員進行表達上有以指針所指向的類型:

printf("size of Header is %d\n", sizeof *metadata); 

作爲一個側面說明,注意sizeof不是一個函數,所以你不需要括號。當你看到括號時,那就是他們是表達式的一部分(演員)。

+0

好的謝謝你的回覆。但我不能能爲這個做的代碼,這樣如何能實現這件事情? – user1089679 2012-03-12 12:02:22

0

你沒有留下足夠的空間,空終止:

header->file[file_count].file_name = (char *)malloc(sizeof(char)*strlen(entry->d_name)); 
+0

問題是有我同意,但是我想使填充頭這樣並希望在文件中寫入和 – user1089679 2012-03-12 12:03:01

+0

@ user1089679回讀,以及:您需要先解決所有的錯誤。 – 2012-03-12 12:04:57