我正在阅读一个充满结构的“非人类可读文件”。我已声明我的结构是该文件的已知成员。我想读取文件从乞讨到填充字段的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);
}
答案 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字节大小的字段。但是你在这里只为每个字段读取一个字节。
您可能只需要阅读结构。如果你真的想要一个中间缓冲区,你必须正确计算偏移量,因为填充可能会让你失望。谷歌的偏移和填充。