64,685
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <share.h>
#include <conio.h>
int fh;
int c,r;
__int64 offset,offset1,i64,n64,l64,r64;
char ln[16000+1];
int main(int argc,char **argv) {
if (argc<2) {
fprintf(stderr,"Usage:%s filename.txt [10]\nto reverse lines of file [default the last 10 lines,-1 for all lines].\n",argv[0]);
return 1;
}
if (argc==2) n64=10i64;
if (argc>2) sscanf(argv[2],"%I64d",&n64);
fh=_sopen(argv[1],_O_BINARY|_O_RDONLY|_O_RANDOM,_SH_DENYNO);
if (-1==fh) {
fprintf(stderr,"Can not _sopen file %s!\n",argv[1]);
return 2;
}
l64=_filelengthi64(fh);if (l64==0i64) {_close(fh);return 0;}
offset=l64;
offset1=_lseeki64(fh,-1i64,SEEK_END);
if (offset1==-1i64) {_close(fh);return 3;}
i64=0i64;
while (1) {
if (_read(fh,&c,1)<1) break;//
if (('\n'==c && offset1<l64-1i64) || offset1==0i64) {
if (offset1!=0i64) offset1++;
if (_lseeki64(fh,offset1,SEEK_SET)==-1i64) break;//
r64=offset-offset1;
if (r64<=16000i64) {
r=_read(fh,ln,(unsigned int)r64);
if (r<=0) break;//
} else {
r=16000;
while (1) {
if (r64>(__int64)r) {
r64-=(__int64)r;
if (1i64==r64 || 2i64==r64) {
r=8000;
r64+=(__int64)r;
}
} else {
r=(int)r64;
r64=0i64;
}
r=_read(fh,ln,r);
if (r<=0) break;//
if (0i64==r64) break;//
ln[r]=0;
printf("%s",ln);
r=16000;
}
if (r<=0) break;//
}
ln[r]=0;
if (r>=2 && ln[r-1]=='\n' && ln[r-2]=='\r') {ln[r-2]='\n';ln[r-1]=0;r--;}//避免输出重定向到文件时行尾多出'\r'
if (i64==0I64) {
if ('\n'!=ln[r-1]) printf("%s\n",ln);
else printf("%s",ln);
} else {
printf("%s",ln);
}
i64++;
if ((i64%10000)==0) cprintf("\r%I64d/%I64d",offset1,l64);
if (n64>0i64 && i64>=n64) break;//
offset=offset1;
_lseeki64(fh,offset1-2i64,SEEK_SET);
offset1-=2i64;
} else {
_lseeki64(fh,-2i64,SEEK_CUR);
offset1--;
}
}
_close(fh);
return 0;
}
void HexDump(char *buf,int len) {
int i,j,k;
char binstr[80];
for (i=0;i<len;i++) {
if (0==(i%16)) {
sprintf(binstr,"%04x -",i);
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
} else if (15==(i%16)) {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
sprintf(binstr,"%s ",binstr);
for (j=i-15;j<=i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
} else {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
}
}
if (0!=(i%16)) {
k=16-(i%16);
for (j=0;j<k;j++) {
sprintf(binstr,"%s ",binstr);
}
sprintf(binstr,"%s ",binstr);
k=16-k;
for (j=i-k;j<i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
}
}
fread(buf,50,1,fdbf);//从文件中读50个字节,放在buf[0]..buf[49]中(这50个字节值中确保没有0x00)
buf[50]=0;//将buf[50]的值设置为0,以免下面输出时该结束未结束。
printf("%s",buf);//输出从buf+0开始,直到0x00结束的字符串。
在确保fdbf=fopen(...,"rb");且char buf[≥91]且没有遇到文件结束的前提下,
除非
for (rec=0;rec<Head.recnum;rec++) {
printf("\n");
fread(buf,50,1,fdbf);buf[50]=0;
printf("%s",buf);//此时buf[49]是一个汉字的前半个字节
fread(buf,40,1,fdbf);buf[40]=0;
printf("%s",buf);//此时buf[0]是一个汉字的后半个字节
}
fflush(stdout);
否则,和
for (rec=0;rec<Head.recnum;rec++) {
printf("\n");
fread(buf,90,1,fdbf);buf[90]=0;
printf("%s",buf);
}
fflush(stdout);
的输出绝对应该是一样的。