【发布时间】:2023-03-06 19:16:02
【问题描述】:
对不起,如果这种格式很乱,这是我第一次使用 stackoverflow。
我正在尝试使用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 字节,然后连续释放它。
【问题讨论】:
-
要将数据读入变量
buf,还是读入buf持有指针的内存块? -
fread(&buf, sizeof(BUFFER), 1, inptr);-->fread(buf, sizeof(BUFFER), 1, inptr); -
首先将错误检查添加到
fopen()和fread()。就目前而言,代码不会采取任何措施来测试访问文件是否有效。
标签: c struct segmentation-fault malloc fread