找回密码
 立即注册
收起左侧

从文件格式化输入

6
回复
6873
查看
[复制链接]
累计签到:30 天
连续签到:1 天
来源: 2017-10-31 11:33:25 显示全部楼层 |阅读模式
1Qter豆
从一个文件中格式化输入到一个结构体数组中,就像fscanf()函数那样:fscanf(fptxt, "CATEGORY:1 SET:1 SEQ:%d FRAME:%d DETECTIONS:%d", &FP_data[obj_count].iSeqNum, &FP_data[obj_count].iFrameNum, &FP_data[obj_count].iDetectionNum);在Qt中应该怎么实现呢?

回复

使用道具 举报

累计签到:53 天
连续签到:1 天
2017-10-31 16:41:07 显示全部楼层
不需要那么麻烦,使用万用型的json类型就可以
存储json的二进制数据或者字符型数据在文件里,然后读取的时候转换下就行
然后你想再转成其他的什么类型都可以!
回复

使用道具 举报

累计签到:30 天
连续签到:1 天
2017-10-31 19:53:02 显示全部楼层
angelus 发表于 2017-10-31 16:41
不需要那么麻烦,使用万用型的json类型就可以
存储json的二进制数据或者字符型数据在文件里,然后读取的时候 ...

我目前是想从一个现有的文件夹里面读取某一些特定的数据出来,比如读取原数据:
CATEGORY:2 SET:1 SEQ:18 FRAME:1 DETECTIONS:4 X261Y343W109H109 X676Y348W55H55 X561Y343W54H54 X464Y343W54H54
将里面的X、Y、W、H后面的数值读取到一个结构体数组中,用fscanf函数的话是:fscanf(fptxt, " X%dY%dW%dH%d", &FP_data[detect_num].iX, &FP_data[detect_num].iY, &FP_data[detect_num].iWidth, &FP_data[detect_num].iHeight);
不知到在qt里面应该用怎样读取
回复

使用道具 举报

累计签到:53 天
连续签到:1 天
2017-11-1 11:34:44 显示全部楼层
可以自己写正则表达式过滤出来你想要的字符串,然后再处理!
回复

使用道具 举报

累计签到:53 天
连续签到:1 天
2017-11-1 12:04:35 显示全部楼层
本帖最后由 angelus 于 2017-11-1 12:10 编辑

QString pattern("X\\d{1,3}Y\\d{1,3}W\\d{1,3}H\\d{1,3}");
QString str("CATEGORY:2 SET:1 SEQ:18 FRAME:1 DETECTIONS:4 X261Y343W109H109 X676Y348W55H55 X561Y343W54H54 X464Y343W54H54");

QStringList getStr(const QString &pattern,const QString &data)
{
    QStringList list;
    QRegExp rx(pattern);
    int pos = 0;
    while(true)
    {
        pos = data.indexOf(rx,pos);
        if(pos < 0) break;
        pos += rx.matchedLength();
        list << rx.capturedTexts();
    }
    return list;
}

代码已经在写在上边了,根据你的程序进行修改就行了!
getStr函数名字你自己取,参数pattern是正则的字符串,data是需要提取的原字符串。
返回一个提取出来的字符串列表!

对纯字符的操作,最快速的就是正则进行筛选
回复

使用道具 举报

累计签到:53 天
连续签到:1 天
2017-11-1 12:32:09 显示全部楼层
本帖最后由 angelus 于 2017-11-1 12:33 编辑

QString pattern("X(\\d{1,3})Y(\\d{1,3})W(\\d{1,3})H(\\d{1,3})");
QString str("CATEGORY:2 SET:1 SEQ:18 FRAME:1 DETECTIONS:4 X261Y343W109H109 X676Y348W55H55 X561Y343W54H54 X464Y343W54H54");


QList<QList<int> > getStr(const QString &pattern,const QString &data)
{
    QList<QList<int> > list;
    QRegExp rx(pattern);
    int pos = 0;
    while(true)
    {
        pos = data.indexOf(rx,pos);
        if(pos < 0) break;
        pos += rx.matchedLength();
        QStringList temp = rx.capturedTexts();
        QList<int> intList;
        for(int i= 1; i < temp.count(); ++i)
        {
            intList.append(rx.cap(i).toInt());
        }
        list.append(intList);
    }
    return list;
}

这个是根据你的要求改良后的,直接取数值的函数
输出是这样的:
((261, 343, 109, 109), (676, 348, 55, 55), (561, 343, 54, 54), (464, 343, 54, 54))

你根据你的程序进行修改,可以自己定义一个类或者结构,代替QList<int>;
回复

使用道具 举报

累计签到:30 天
连续签到:1 天
2017-11-2 09:58:16 显示全部楼层
angelus 发表于 2017-11-1 12:32
QString pattern("X(\\d{1,3})Y(\\d{1,3})W(\\d{1,3})H(\\d{1,3})");
QString str("CATEGORY:2 SET:1 SEQ:1 ...

好的,谢谢大神,笔芯
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了