一次从文件中读取 512 个字节并检查里面有啥?
Posted
技术标签:
【中文标题】一次从文件中读取 512 个字节并检查里面有啥?【英文标题】:reading 512 bytes at a time from a file and checking what's inside?一次从文件中读取 512 个字节并检查里面有什么? 【发布时间】:2013-03-18 22:51:07 【问题描述】:我有一个大文件,里面包含很多 jpeg。所有的jpeg都需要一张一张的提取出来。以下是我解决此问题的第一步:
1) 定义“块”变量并为其分配 512 字节的存储空间
2) 打开包含所有 jpeg 的文件并循环遍历它直到 eof
3) 抓取第一个块(512 字节)并查看里面有什么
目前我的代码无法编译。这是我的错误:
recover.c:27:19: error: implicitly declaring C library function
'malloc' with type 'void *(unsigned int)' [-Werror]
char* block = malloc(BYTE * 512);
^ recover.c:27:19: note: please include the header <stdlib.h> or explicitly provide a declaration for 'malloc'
recover.c:27:26: error: unexpected type name 'BYTE': expected
expression
char* block = malloc(BYTE * 512);
^ recover.c:45:18: error: conversion specifies type 'int' but the argument has type 'char *'
[-Werror,-Wformat]
printf("%c", block);
~^ ~~~~~
%s
这是我目前的代码:
#include <stdio.h>
#include <stdint.h>
typedef uint8_t BYTE;
//SOI - 0xFF 0xD8
//EOI - 0xFF 0xD9
//APPn - 0xFF 0xEn
int main(void)
//FAT - 512 bytes per block
char* block = malloc(BYTE * 512);
//open file containing pictures
FILE* fh = fopen("card.raw", "rd");
//make sure the file opened without errors
if (fh == NULL)
printf("something went wrong and file could not be opened");
return 1;
while (!feof(fh))
setbuf(fh, block);
printf("%c", block);
fclose(fh);
return 0;
我做错了什么?为什么不是 char* block = malloc(BYTE * 512);分配 512 个字节,但会引发错误? 另外,由于我什至还不能编译这一段,我是否正确读取了 512 个字节?如果没有,我该怎么做?
谢谢。
【问题讨论】:
您要做的第一件事是包含 stdlib.h,以便在范围内有一个适合 malloc() 的原型。然后,检查 malloc() 的返回值以确保它成功。这至少应该能让你走上正确的道路。 错误信息告诉你确切的问题;你需要#include <stdlib.h>
。
在这段代码中根本不需要使用malloc()
。只需声明char block[512]
;
【参考方案1】:
你想:
#include <stdlib.h>
获取malloc()
的定义。
char* block = malloc(BYTE * 512);
应该是(因为malloc
已经采用字节形式的参数;sizeof(BYTE)
将返回 1
):
char* block = malloc(512);
还有:
printf("%c", block);
应该是:
printf("%s", block);
正如 EJP 在评论中所说,虽然这不是错误,但实际上并不需要动态分配 buffer
和 malloc()
。您已经知道您将需要 512 字节来执行您正在执行的操作,因此您可以将该行替换为:
char block[512];
我认为您使用 clang 作为编译器,正如您所见,它对错误消息非常有帮助,它基本上告诉您如何修复它。
【讨论】:
@RandyHoward 感谢您的澄清。 谢谢!不知道我是怎么错过编译器告诉我的。以上是关于一次从文件中读取 512 个字节并检查里面有啥?的主要内容,如果未能解决你的问题,请参考以下文章