64,631
社区成员
发帖
与我相关
我的任务
分享
#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;
}
//问题:
// 1.打开一个文本文件。
// 2.查找这个文本文件的第r行的第c1-c2列?
//
// 如:
// 文件:a
// 11111111
// 22222QQQ
// 33333333
//
// 查找第2行,第6-8列。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXC 16000
char ln[MAXC];
FILE *f;
int r,c1,c2,n,L;
void getc1c2(char *fn) {
ln[c2]=0;
printf("Text at row(%d),column(%d..%d) of file %s is [%s]\n",r,c1,c2,fn,ln+c1-1);
}
int main(int argc,char **argv) {
if (argc<5) {
HELP:
printf("Usage:\n %s filename.ext r c1 c2\nto get text at row(r),column(c1..c2) of filename.ext\n",argv[0]);
return 1;
}
r=atoi(argv[2]);
c1=atoi(argv[3]);
c2=atoi(argv[4]);
if (r<=0 || c1<=0 || c2<c1 || c2>=MAXC) goto HELP;
f=fopen(argv[1],"r");
if (NULL==f) {
printf("Can not open file %s!\n",argv[1]);
return 2;
}
n=0;
while (1) {
if (NULL==fgets(ln,MAXC,f)) break;
L=strlen(ln);
if ('\n'==ln[L-1]) {
memset(ln+L-1,0,MAXC-L+1);
n++;
if (r==n) {getc1c2(argv[1]);break;}
} else {
n++;
if (r==n) {getc1c2(argv[1]);break;}
printf("Warning: line %d too long(>%d characters)! Ignore tails.",n,MAXC);
while (1) {
if (NULL==fgets(ln,MAXC,f)) goto END;
L=strlen(ln);
if ('\n'==ln[L-1]) break;
}
}
}
END:
fclose(f);
return 0;
}
//C:\test\Debug>frcc a 2 6 8
//Text at row(2),column(6..8) of file a is [QQQ]
//