把一个文件的前 512位去掉

chashenmea 2009-10-27 09:16:43
把一个文件的前 512位去掉,不改变后面的内容该如何实现???
...全文
108 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xhd3767 2009-10-27
  • 打赏
  • 举报
回复
每次打开的时候偏移指针就Ok了嘛!!!

删除干嘛...
赵4老师 2009-10-27
  • 打赏
  • 举报
回复
在cmd窗口里面执行
cft 源文件 64
即可得到‘64-源文件’,其内容就是‘源文件’前512位(64字节)去掉后对应内容。
赵4老师 2009-10-27
  • 打赏
  • 举报
回复
下载我的资源里面的cft
源码如下

#include <sys\stat.h>
#include <io.h>
#include <fcntl.h>
#include <share.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define MAX_CLU_BYTES 65536
FILE *fo;
int fh;
__int64 offs,offs1;
__int64 rvi64;
int rv,wrv;
unsigned char buf[MAX_CLU_BYTES];
char ofn[_MAX_PATH];
void main(int argc,char **argv) {
if (argc<3) {
printf("Copy File Tail.\n");
printf("Usage:\n");
printf(" cft filename.ext offset_begin[-offset_end]\n");
printf("Copy filename.ext offset_begin[-offset_end] to offset_begin[-offset_end]-filename.ext\n");
printf("Note: Byte at offset_end is NOT included.\n");
printf("Example:\n");
printf(" cft abc.rar 12345\n");
printf("Copy abc.rar offset 12345-end to 12345-abc.rar\n");
printf(" cft abc.rar 123-12345\n");
printf("Copy abc.rar offset 123-12345 to 123-12345-abc.rar\n");
printf(" cft abc.rar 0xAB-0xCD\n");
printf("Copy abc.rar offset 0xAB-0xCD to 0xAB-0xCD-abc.rar\n");
return;
}
rv=sscanf(argv[2],"%I64i-%I64i",&offs,&offs1);
if (rv==0) {
printf("offset %s is not number\n",argv[2]);
return;
}
fh=_sopen(argv[1],_O_BINARY|_O_RDONLY|_O_RANDOM,_SH_DENYWR);
if (fh==-1) {
printf("_sopen %s errno=%d\n",argv[1],errno);
return;
}
if (rv==1) {
offs1=_filelengthi64(fh);
if (offs1==-1i64) {
printf("%I64=_filelengthi64 errno=%d\n",offs1,errno);
_close(fh);
return;
}
} else {//rv==2
if (offs1<offs) {
printf("%s offset_begin>offset_end error\n",argv[2]);
_close(fh);
return;
}
}
rvi64=_lseeki64(fh,offs,SEEK_SET);
if (rvi64!=offs) {
printf("%I64u=_lseeki64 %I64u errno=%d\n",rvi64,offs,errno);
_close(fh);
return;
}
sprintf(ofn,"%s-",argv[2]);
strcat(ofn,argv[1]);
fo=fopen(ofn,"wb");
if (fo==NULL) {
_close(fh);
printf("fopen %s error\n",ofn);
return;
}
cprintf("\n%I64u\r",offs);
while (1) {
rv=_read(fh,buf,(unsigned int)__min(offs1-offs,MAX_CLU_BYTES));
if (rv==0) break;//
if (rv<0) {
fclose(fo);
_close(fh);
printf("_read %s offset %I64u error\n",argv[1],offs);
return;
}
wrv=fwrite(buf,1,rv,fo);
if (wrv!=rv) {
fclose(fo);
_close(fh);
printf("fwrite %s error\n",ofn);
return;
} else {
offs+=rv;
cprintf("%I64u\r",offs);
if (offs>=offs1) break;//
}
}
fclose(fo);
_close(fh);
printf("Copy %s offset %s to %s OK.\n",argv[1],argv[2],ofn);
}
whg01 2009-10-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 y_l_stone 的回复:]
512位就只能那么做了
如果簇的整数倍的话可以更改簇链
[/Quote]
这要绕过文件系统直接访问硬盘,不推荐;除非是在写文件系统。
taodm 2009-10-27
  • 打赏
  • 举报
回复
重建文件。
y_l_stone 2009-10-27
  • 打赏
  • 举报
回复
512位就只能那么做了
如果簇的整数倍的话可以更改簇链
whg01 2009-10-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 loaden 的回复:]
可以新建一个文件,将相应内容拷贝到新文件中,再删除旧文件。
[/Quote]
文件不像链表,能随意的插入、删除。基本上可以把文件理解为磁带。
只能这么做,或者采取类似的办法。
lihan6415151528 2009-10-27
  • 打赏
  • 举报
回复
采取复制相应位数吧
老邓 2009-10-27
  • 打赏
  • 举报
回复
可以新建一个文件,将相应内容拷贝到新文件中,再删除旧文件。

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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