WessonX 2020-05-24 14:55 采纳率: 100%
浏览 2178
已采纳

在QT中使用QTextStream的readline读取文本文件时,默认不设置readline参数后从第二行读取,第一行内容不能正常显示

1.问题如标题所描述的那样。
2.下面贴代码:

QFile file("d://wessontest.txt");
file.open(QIODevice::ReadOnly|QIODevice::Text);
QTextStream in(&file);
Student stu;     //Student自定义类型,包含姓名,学号,成绩,排名四个成员
while(!in.atEnd())
{
     in.readLine();
         in>>stu.name>>stu.sno>>stu.score>>stu.ranking;
         qDebug()<<stu.name<<" "<<stu.sno<<" "<<stu.score<<" "<<stu.ranking;
        }

结果如下:
图片说明

第一行数据是缺失的。

后来我在网上参考了关于按行读取的代码,例子如下:

    while (!in.atEnd())
    {
    QString line = in.readLine();
    qDebug()<<line;
    }

这种情况下能够正常读取所有结果。

不太能够理解为什么我将文件流读取到对象中会出错,直接按照string输出就没错。

后来偶然将第一种情形中的in.readline()里面的参数设置为-1,竟然得到了正常的结果。即:

while(!in.atEnd())
{
     in.readLine(-1);
         in>>stu.name>>stu.sno>>stu.score>>stu.ranking;
         qDebug()<<stu.name<<" "<<stu.sno<<" "<<stu.score<<" "<<stu.ranking;
        }

图片说明

拜托各位大神!!!

  • 写回答

1条回答 默认 最新

  • 非弋 2020-05-25 10:19
    关注
    第一次执行in.readLine()后,光标定位在第二行的开头
    第一次执行in>>stu.name后(将第二行的数据填充Student),光标定位在第二行结尾
    第二次执行in.readLine()后(读取的内容为空),光标定位在第三行的开头
    第二次执行in>>stu.name后(将第三行的数据填充Student),光标定位在第三行结尾
    
    Student stu;
    while (!in.atEnd()) {
        QString line = in.readLine();
        qDebug() << "test: " << line;
        in >> stu.name >> stu.sno >> stu.score >> stu.ranking;
        qDebug() << stu.name << stu.sno << stu.score << stu.ranking;
    }
    
    输出:
    test:  "Wesson 201930344107 100 1"
    "Jim" "201930344108" 98 2
    test:  ""
    "Alex" "201930344109" 97 3
    test:  ""
    "John" "201930344110" 96 4
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况