请问一个读取二进制文件的问题?

chp845 2012-03-21 09:25:35
	FILE* file;
errno_t err=fopen_s(&file,"1.pdf", "r");
if(err)
return false;
int fseekres=fseek(file,0,SEEK_END);
int length=ftell(file);
fseekres=fseek(file,0,SEEK_SET);
char * buffer=new char(length);
fread(buffer,length,1,file);
fclose(file);

我读取出来的数据是:buffer 0x004b4ba8 "=?"
请问下我想查找一下char * sercha="%PDF-"这个字符串在buffer中位置?
我用的算法:
size_t inline Find(char *buffer,char *search,size_t buffersize)
{
if(!buffer||!search)
return -1;
char *bufferex=buffer;
int len=strlen(search);
bool fnd=false;
while (!fnd)
{
fnd=true;
for (size_t i=0;i<len;i++)
{
if(buffer[i]!=search[i])
{
fnd=false;
break;
}
}
if(fnd)
return buffer-bufferex;
buffer++;
if(buffer-bufferex+len>=buffersize)
return -1;
}

return -1;
}

查找:size_t index=FindString(buffer,"%PDF-",length);
但是运行的时候提示buffer的位置不可以写读,请问下,我怎么才可以正确查找出buffer中%PDF的位置?
我的写法有什么问题吗?
...全文
108 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
chp845 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 superly 的回复:]

关键是:
fopen_s(&file,"1.pdf", "rb");
[/Quote]
不是这个问题,我刚才已经加了b这个字符,但是我把代码全部重写了以遍,又没有问题了,郁闷了呀!
SuperLy 2012-03-21
  • 打赏
  • 举报
回复
关键是:
fopen_s(&file,"1.pdf", "rb");
gqjjqg 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 chp845 的回复:]

引用 3 楼 gqjjqg 的回复:

strstr 会比较方便。

运行到哪里提示 buffer的位置不可以写读?

大问题没看到,
小问题,开始的时候越界判断都木有,容易出错。

关键是:buffer读出来是0x004b4ba8 "=?"
[/Quote]

PDF 用十六进制方式文本查看,对比下读出来的内容不就知道了。
chp845 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 gqjjqg 的回复:]

strstr 会比较方便。

运行到哪里提示 buffer的位置不可以写读?

大问题没看到,
小问题,开始的时候越界判断都木有,容易出错。
[/Quote]
关键是:buffer读出来是0x004b4ba8 "=?"
gqjjqg 2012-03-21
  • 打赏
  • 举报
回复
strstr 会比较方便。

运行到哪里提示 buffer的位置不可以写读?

大问题没看到,
小问题,开始的时候越界判断都木有,容易出错。
JoeBlackzqq 2012-03-21
  • 打赏
  • 举报
回复
上面的回答是我错了,没想到fopen的函数原型已经作了大改变,哈哈,sorry!

errno_t fopen_s(
FILE** pFile,
const char *filename,
const char *mode
);

char * buffer=new char(length); ==> new char[length];
JoeBlackzqq 2012-03-21
  • 打赏
  • 举报
回复
fopen_s(&file,"1.pdf", "r"); ===> 这也叫打开文件呀??!!!

&file应该改成要打开的文件名全路径!!看参数原型:

FILE * fopen( const char * filename,
const char * mode );
赵4老师 2012-03-21
  • 打赏
  • 举报
回复
不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧