将数据从文件读入结构(C)

时间:2016-06-07 05:25:30

标签: c struct segmentation-fault malloc fread

很抱歉,如果这种格式很乱,这是我第一次使用stackoverflow。 我试图使用-Werror=format函数以512字节的块读入printf文件,并将块的前4个字节存储到fread中,剩下的另外508个字节存入字节数组。但是,当我尝试运行此操作时,我遇到了分段错误。当我尝试调试时,在调用card.raw函数后,s1-s4freadargvoutptr值都变为inptr。为什么这样,我做错了什么?

buf

if语句用于检查NULL的前3个元素是否包含以下十六进制签名。我想在循环中使用typedef uint8_t BYTE; //block of 512 bytes typedef struct { BYTE s1; BYTE s2; BYTE s3; BYTE s4; BYTE image[508]; } BUFFER; int main(int argc, char* argv[]) { //opens memory card file FILE* inptr = fopen("card.raw", "r"); int jpgcounter = 0; //creates jpg file char title[7]; sprintf(title, "%d.jpg", jpgcounter); FILE* outptr = fopen(title, "a"); //create buf (pointer) of type BUFFER BUFFER* buf; do { //creates buffer structure for storage of 512B blocks buf = malloc(sizeof(BUFFER)); //read 512 bytes at a time & stores every 512B block into a buffer struct buf fread(&buf, sizeof(BUFFER), 1, inptr); if(buf->s1 == 0xff && buf->s2 == 0xd8 && buf->s3 == 0xff) { 以便在512字节的结构中读取原始文件,决定如何处理512字节,然后连续释放它。

2 个答案:

答案 0 :(得分:0)

使用fread(buf, sizeof(BUFFER), 1, inptr);代替fread(&buf, sizeof(BUFFER), 1, inptr);同时以二进制模式打开文件,即"rb"代替"r"

答案 1 :(得分:0)

当您将&buf指针而不是buf传递到fread函数时,它将不是在分配的堆缓冲区中写入您的数据,而是在您的函数堆栈上。由于x86平台上的堆栈朝着较低的内存地址增长,这将覆盖堆栈上的所有内容,即在buf变量之前 - 在您的情况下是局部变量,函数参数argcargv等,并返回地址。堆栈已损坏,您会遇到分段错误。