2012-03-12 1 views
0

ここでは、いくつかのファイルを持つ1つのディレクトリがあります。メタデータの構造体

このファイルには、すべての情報を1つの構造内に記入したいと考えています。

私は次の2つの構造を持っています。

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; 

これらのファイルに関するすべての情報を含む1つのヘッダーを作成します。

私が3つのファイルを持っているかのように、file_count = 3でこのような構造にしたいのですが、どうすれば2番目の変数値を割り当てることができますか?ファイルごとにファイル名とファイルサイズを格納する必要があります。

私はこの

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 

ITSは異なる出力を示しています。ここで何が問題なの?

+2

ここで特に問題は何ですか? –

+1

[ファイルのヘッダー(メタデータ)をカスタマイズする]の複製が可能です(http://stackoverflow.com/questions/9664536/create-customize-headermetadata-for-files) –

+0

私はリンクされたリストでこれを達成できますか? – user1089679

答えて

0

、あなたはポインタ変数にsizeofを使用して、それはあなたに指摘されているオブジェクトのサイズを与えると考えているようだしていますに。それはしません。これを行うには、でポインタポイントという型を持つ式を作るために、アスタリスク演算子を使用します。注意点として

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

、あなたが括弧を必要としないのでsizeofは、機能ではないことに気づきます。カッコが見えるときは、それが式の一部(キャスト)です。

+0

ご回答いただきありがとうございます。しかし、私はこれのためにコードを行うことができないので、どのようにこのことを達成することができますか? – user1089679

0

あなたはNULL終止符のための十分な余地を残していないされています。とりわけ

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

問題はありますが、私は同意しますが、私はこのようなヘッダを埋めたいと思っています。ファイルに書き込んで、読み返したいだけです。 – user1089679

+0

@ user1089679:まずすべてのバグを修正する必要があります。 –