抱歉,如果格式很乱,这是我第一次使用 stackoverflow。
我正在尝试使用 fread
函数以 512 字节的 block 读入 card.raw
文件,并将该 block 的前 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"
关于c - 从文件读取数据到结构体中 (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37671128/