lseek()和read()正确用法

时间:2015-05-03 22:55:42

标签: c

我正在阅读一个充满结构的“非人类可读文件”。我已声明我的结构是该文件的已知成员。我想读取文件从乞讨到填充字段的stuct的大小。我不明白为什么我的out put对于所有struct字段都是零。我查看了这些函数的手册页,我相信我正确使用它们,所以我只是没有正确地从缓冲区访问字段,或者?请参阅下面的代码段。

typedef struct Pacientes
{
    char nome[MAX];
    int num_bi;
    char *data_entrada;
}Paciente;

typedef struct NodeLists
{
    Paciente pac;
    List next;
}NodeList;

好的,考虑了一些建议,但实际上我并不关心此时的错误检查。以下结果是一个seg错误,因为我确定这不是正确读入结构,但我试图使用这些建议。

int main (int argc, char * argv[])
{
    // make sure you were given an image
    if (argc != 2)
    {
        printf("no image\n");
        return -1;
    }

    int fs_fd = open(argv[1], O_RDWR);

    // make sure you can open the image
    if(fs_fd == -1)
    {
        printf("image is busted\n");
        return -1;
    }

    struct superblock *mySB;
    mySB = malloc(sizeof(struct superblock));
    mySB->size = 0;
    mySB->nblocks = 0;
    mySB->ninodes = 0;

    char buffer[4096];
    if(lseek(fs_fd, 0, SEEK_SET));
    read(fs_fd, &buffer, sizeof(struct superblock));

    mySB->size = buffer[0];
    mySB->nblocks = buffer[4];
    mySB->ninodes = buffer[8];

    printf("Size: %u, nblocks: %u, ninodes: %u\n", mySB->size, mySB->nblocks, mySB->ninodes);
}

1 个答案:

答案 0 :(得分:1)

为什么没有可编译的测试用例和示例文件?

int fs_fd = open(argv[1], O_RDWR);

// make sure you can open the image
if(fs_fd == -1)
{
    printf("image is busted\n");
    return -1;
}

错误。至少使用perror告诉用户错误是什么。无论如何,fs_fd的名字是什么?标准名称仅为fd。

struct superblock *mySB;
mySB = malloc(sizeof(struct superblock));

考虑sizeof(* mySB);.可以说可以忽略空检查。

mySB->size = 0;
mySB->nblocks = 0;
mySB->ninodes = 0;

如果你在下面初始化相同的字段,这有什么意义呢?

char buffer[4096];
if(lseek(fs_fd, 0, SEEK_SET));

什么?不仅开始时偏移已经开始,您只是以最坏的方式忽略错误(如果有的话)。如果你真的需要调用它并忽略错误,请执行(void)lseek(fd_fd,0,SEEK_SET)。

read(fs_fd, &buffer, sizeof(struct superblock));

如何进行错误检查。如果只读取结构的大小,为什么缓冲区为4096?如果结构更大会怎么样?

mySB->size = buffer[0];
mySB->nblocks = buffer[4];
mySB->ninodes = buffer[8];

没人知道这个结构是怎么样的。 似乎你有4字节大小的字段。但是你在这里只为每个字段读取一个字节。

您可能只需要阅读结构。如果你真的想要一个中间缓冲区,你必须正确计算偏移量,因为填充可能会让你失望。谷歌的偏移和填充。