Хотите заполнить структуру для метаданных - PullRequest
0 голосов
/ 12 марта 2012

Здесь у меня есть один каталог с количеством файлов.

Я хочу заполнить эти файлы всей информацией в одной структуре.

У меня есть две следующие структуры.

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 ]

0 голосов
/ 12 марта 2012

Помимо прочего, вы используете sizeof для переменной-указателя, но, похоже, думаете, что это дает вам размер объекта, на который указывает указатель.Это не так.Для этого используйте оператор звездочки, чтобы выражение имело тип, на который указывает указатель:

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

В качестве примечания отметим, что sizeof не является функцией, поэтому вы ненужна скобка.Когда вы видите круглые скобки, тогда они становятся частью выражения (приведение).

0 голосов
/ 12 марта 2012

Вы не оставляете достаточно места для нулевого терминатора:

header->file[file_count].file_name = (char *)malloc(sizeof(char)*strlen(entry->d_name));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...