weixin_52183032 2022-12-16 12:42 采纳率: 0%
浏览 20

QT倒序读取txt文件

QT如何倒序读取txt文件并输出到另一个txt文件?
QT如何倒序读取txt文件并输出到另一个txt文件?
QT如何倒序读取txt文件并输出到另一个txt文件?

  • 写回答

2条回答 默认 最新

  • 赵4老师 2022-12-16 13:53
    关注

    仅供参考:

    #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;
    }
    
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 12月16日

悬赏问题

  • ¥15 ecplise在连接数据库时显示加载驱动成功但是数据库连接失败
  • ¥15 visionmaster启动失败,提示为“机器不满足授权而被禁用”
  • ¥50 用logisim设计16位单时钟周期cpu
  • ¥15 IDEA中圈复杂度如何具体设置
  • ¥50 labview采集不了数据
  • ¥15 Multisim红外倒车雷达仿真中距离问题
  • ¥15 请上面代码做什么处理或什么混淆
  • ¥15 英雄联盟自定义房间置顶
  • ¥15 W5500网线插上无反应
  • ¥15 如何用字典的Key,显示在WPF的xaml中