C-读取文件中的结构
您好,我想读取我用C-读取文件中的结构,c,struct,fwrite,lseek,C,Struct,Fwrite,Lseek,您好,我想读取我用fwrite在文件中编写的结构中的一些信息,但有一个问题,我无法提取这些信息。我有两个文件 tttfs.h: #include <stdlib.h> #include <stdio.h> #include <stdint.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h>
fwrite
在文件中编写的结构中的一些信息,但有一个问题,我无法提取这些信息。我有两个文件
tttfs.h:
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
typedef struct _disk disk;
typedef struct _block block;
struct _block{
uint8_t *unBlock;
};
struct _disk{
int id;
block *diskBlock;
};
不是我所期望的,我在没有阅读的情况下尝试了,我得到了同样的结果。所以我的程序没有从磁盘写入信息。或者在磁盘中写入块时出现问题?我不能确定您到底想要什么,但这应该可以
#define BLOCK_BUFF_SIZE (1024*sizeof(block))
int tttfs_create(int size, char *name);
int tttfs_load(char *fname, disk *pdisk)
void inttolitend(uint32_t x, uint8_t* lit_int);
int tttfs_load(char *fname, disk *pdisk){
int fd;
unsigned int n;
int i;
fd = open("disk.tfs",_O_RDONLY);
if(fd==-1){
perror("tttfs_load.open");
return -1;
}
n=lseek (fd,0,SEEK_END);
lseek(fd,0,SEEK_SET);
if(n==(unsigned int)-1){
close(fd);
return -1;
}
if(n){
n/=(BLOCK_BUFF_SIZE);
pdisk->diskBlock=malloc(n*sizeof(block));
for(i=0;i<n;i++){
pdisk->diskBlock[i].unBlock=malloc(BLOCK_BUFF_SIZE);
read(fd,pdisk->diskBlock[i].unBlock,BLOCK_BUFF_SIZE);
}
}
close(fd);
return n;
}
int main(){
unsigned int n;
disk d;
int i;
tttfs_create(7, "disk.tfs");
n=tttfs_load("disk.tfs",&d);
if(!n || n==(-1)) return -1;
for(i=0; i<4; i++){
printf("%d\n", (uint8_t)(d.diskBlock->unBlock[i]));//print my result.
}
}
int tttfs_create(int size, char *name){
FILE *f = NULL;
disk d;
int i;
if (!(f = fopen(name, "wb"))) {
perror("tttfs_create:open()");
return 0;
}
d.diskBlock = malloc(sizeof(block) * size);
d.id = 1;
for(i = 0; i<size; i++){
d.diskBlock[i].unBlock = malloc(BLOCK_BUFF_SIZE);
}
inttolitend(size, (uint8_t*)(d.diskBlock->unBlock));
for(i=0;i<size;i++){
fwrite(d.diskBlock[i].unBlock ,BLOCK_BUFF_SIZE,1,f);
}
return 1;
}
void inttolitend(uint32_t x, uint8_t* lit_int){
lit_int[3] = ((x<<24) & 0xff);
lit_int[2] = ((x<<16) & 0xff);
lit_int[1] = ((x<<8) & 0xff);
lit_int[0] = ((x<<0) & 0xff);
}
#定义块_BUFF_大小(1024*sizeof(块))
int tttfs_create(int size,char*name);
int tttfs_加载(字符*fname,磁盘*pdisk)
无效inttolitend(uint32\u t x,uint8\u t*lit\u int);
int tttfs_加载(字符*fname,磁盘*pdisk){
int-fd;
无符号整数n;
int i;
fd=打开(“disk.tfs”,仅限rdu);
如果(fd==-1){
perror(“tttfs_load.open”);
返回-1;
}
n=lseek(fd,0,SEEK_END);
lseek(fd,0,SEEK_集);
if(n==(无符号整数)-1){
关闭(fd);
返回-1;
}
如果(n){
n/=(块大小);
pdisk->diskBlock=malloc(n*sizeof(block));
对于(i=0;idiskBlock[i]。取消阻塞=malloc(块大小);
读取(fd,pdisk->diskBlock[i]。解除阻塞,块大小);
}
}
关闭(fd);
返回n;
}
int main(){
无符号整数n;
磁盘d;
int i;
tttfs_create(7,“disk.tfs”);
n=tttfs_加载(“disk.tfs”和&d);
如果(!n | n==(-1))返回-1;
对于(i=0;iunBlock[i]);//打印我的结果。
}
}
int tttfs_创建(int大小,字符*名称){
文件*f=NULL;
磁盘d;
int i;
如果(!(f=fopen(名称,“wb”)){
perror(“tttfs_create:open()”;
返回0;
}
d、 diskBlock=malloc(sizeof(block)*大小);
d、 id=1;
对于(i=0;iunBlock));
对于(i=0;它是fwrite(&d->diskBlock[i],sizeof(block),1,f);
仍然错误。@iharob我必须更改什么?sizeof
?也添加块的大小,sizeof(block)+1024
我想。请小心仔细想想,我记得你上一个问题,但我不是100%肯定。@iharob这是一个很长的故事,但我的大学搞砸了……他们没有教我们C的基础知识,也没有用高级C来处理系统问题……所以我真的对malloc和所有这些东西感到迷茫。@iharob我改变了它,测试了a收获。总是一样的问题。。。
0
8
16
24
#define BLOCK_BUFF_SIZE (1024*sizeof(block))
int tttfs_create(int size, char *name);
int tttfs_load(char *fname, disk *pdisk)
void inttolitend(uint32_t x, uint8_t* lit_int);
int tttfs_load(char *fname, disk *pdisk){
int fd;
unsigned int n;
int i;
fd = open("disk.tfs",_O_RDONLY);
if(fd==-1){
perror("tttfs_load.open");
return -1;
}
n=lseek (fd,0,SEEK_END);
lseek(fd,0,SEEK_SET);
if(n==(unsigned int)-1){
close(fd);
return -1;
}
if(n){
n/=(BLOCK_BUFF_SIZE);
pdisk->diskBlock=malloc(n*sizeof(block));
for(i=0;i<n;i++){
pdisk->diskBlock[i].unBlock=malloc(BLOCK_BUFF_SIZE);
read(fd,pdisk->diskBlock[i].unBlock,BLOCK_BUFF_SIZE);
}
}
close(fd);
return n;
}
int main(){
unsigned int n;
disk d;
int i;
tttfs_create(7, "disk.tfs");
n=tttfs_load("disk.tfs",&d);
if(!n || n==(-1)) return -1;
for(i=0; i<4; i++){
printf("%d\n", (uint8_t)(d.diskBlock->unBlock[i]));//print my result.
}
}
int tttfs_create(int size, char *name){
FILE *f = NULL;
disk d;
int i;
if (!(f = fopen(name, "wb"))) {
perror("tttfs_create:open()");
return 0;
}
d.diskBlock = malloc(sizeof(block) * size);
d.id = 1;
for(i = 0; i<size; i++){
d.diskBlock[i].unBlock = malloc(BLOCK_BUFF_SIZE);
}
inttolitend(size, (uint8_t*)(d.diskBlock->unBlock));
for(i=0;i<size;i++){
fwrite(d.diskBlock[i].unBlock ,BLOCK_BUFF_SIZE,1,f);
}
return 1;
}
void inttolitend(uint32_t x, uint8_t* lit_int){
lit_int[3] = ((x<<24) & 0xff);
lit_int[2] = ((x<<16) & 0xff);
lit_int[1] = ((x<<8) & 0xff);
lit_int[0] = ((x<<0) & 0xff);
}