将文件中的数据读入结构 (C)
Reading data from file into a struct (C)
抱歉,如果格式混乱,这是我第一次使用 Whosebug。
我正在尝试使用 fread
函数以 512 字节的块读入 card.raw
文件,并将该块的前 4 个字节存储到 s1-s4
中,剩下的 508 个字节存储到字节数组。但是,当我尝试 运行 时,出现分段错误。当我尝试调试时,调用fread
函数后,argv
、outptr
、inptr
和buf
值都变成了NULL
。为什么会这样,我做错了什么?
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)
{
if语句用于检查buf
的前3个元素是否包含以下十六进制签名。我想在循环中使用 malloc
以读取 512 字节结构中的原始文件,决定如何处理 512 字节,然后连续释放它。
使用 fread(buf, sizeof(BUFFER), 1, inptr);
而不是 fread(&buf, sizeof(BUFFER), 1, inptr);
还以二进制模式打开文件以读取,即 "rb"
而不是 "r"
当您将 &buf
指针而不是 buf
传递给 fread
函数时,它不会将您的数据写入分配的堆缓冲区,而是写入您的函数堆栈。由于 x86
平台上的堆栈向较低的内存地址增长,这将覆盖堆栈上的所有内容,即在您的 buf
变量之前 - 在您的情况下是局部变量,函数参数 argc
, argv
等和 return 地址。堆栈损坏,出现分段错误。
抱歉,如果格式混乱,这是我第一次使用 Whosebug。
我正在尝试使用 fread
函数以 512 字节的块读入 card.raw
文件,并将该块的前 4 个字节存储到 s1-s4
中,剩下的 508 个字节存储到字节数组。但是,当我尝试 运行 时,出现分段错误。当我尝试调试时,调用fread
函数后,argv
、outptr
、inptr
和buf
值都变成了NULL
。为什么会这样,我做错了什么?
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)
{
if语句用于检查buf
的前3个元素是否包含以下十六进制签名。我想在循环中使用 malloc
以读取 512 字节结构中的原始文件,决定如何处理 512 字节,然后连续释放它。
使用 fread(buf, sizeof(BUFFER), 1, inptr);
而不是 fread(&buf, sizeof(BUFFER), 1, inptr);
还以二进制模式打开文件以读取,即 "rb"
而不是 "r"
当您将 &buf
指针而不是 buf
传递给 fread
函数时,它不会将您的数据写入分配的堆缓冲区,而是写入您的函数堆栈。由于 x86
平台上的堆栈向较低的内存地址增长,这将覆盖堆栈上的所有内容,即在您的 buf
变量之前 - 在您的情况下是局部变量,函数参数 argc
, argv
等和 return 地址。堆栈损坏,出现分段错误。