인프런 커뮤니티 질문&답변

xlql555님의 프로필 이미지

작성한 질문수

[입문] Qt 6 프로그래밍 1편

QFile 과 QDataStream 을 이용한 예제 구현

최신 버전에서 QDataStream의 파일 입출력

해결된 질문

22.06.29 20:55 작성

·

657

2

안녕하세요. 강의 잘 듣고 있습니다.

현재 최신 버전의 QT Creator를 사용하여 수강중인데, 해당 강의의 경우 가격 정보를 읽어오는 부분에서 차이가 있어서 질문드립니다.

in >> keyboardPrice;

 

in >> monitoryPrice;

강의에서는 위와 같이 Keyboard , Monitor 순으로 받아오는데 강의 결과값과 달리 저는 두 값이 바뀌어 저장이 됩니다. 혹시 최신 버전의 QDataStream 파일 입출력 알고리즘이 변화가 있었는지, 아니면 제 실수인지 궁금해서 질문 드립니다. 아래는 강의의 결과와 같게 나오기 위해 수정한 제 코드입니다.

 

#include "widget.h"
#include "ui_widget.h"
 
#include <QDataStream>
#include <QDebug>
 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
 
    setWindowTitle("QFile을 이용한 예제");
 
    connect(ui->pbSave, SIGNAL(pressed()), 
this, SLOT(slot_pbFileSave()));
    connect(ui->pbLoad, SIGNAL(pressed()), 
this, SLOT(slot_pbFileLoad()));
 
    m_file = new QFile();
 
    if(QFile::exists("c:/QT/price.data"))
    {
        m_file->setFileName("c:/QT/price.data");
    }
}
 
Widget::~Widget()
{
    delete ui;
}
 
void Widget::slot_pbFileSave()
{
    QString fileName = QString("c:/QT/price.data");
 
    m_file->setFileName(fileName);
 
    if(!m_file->open((QIODevice::WriteOnly 
| QIODevice::Truncate)))
    {
        qDebug("File Open Fail !");
 
        return;
    }
    else
    {
        qint32 keyboardPrice = ui->leKeyboard->text().toInt();
        qint32 monitorPrice = ui->leMonitor->text().toInt();
 
        QDataStream out(m_file);
 
        out << keyboardPrice;
        out << monitorPrice;
 
        m_file->flush();
        m_file->close();
    }
}
 
void Widget::slot_pbFileLoad()
{
    if(!m_file->open(QIODevice::ReadOnly))
    {
        qDebug("File Open Fail !");
 
        return;
    }
 
    qint32 keyboardPrice;
    qint32 monitorPrice;
 
    QDataStream in(m_file);
 
    in >> monitorPrice;
    in >> keyboardPrice;
 
    m_file->flush();
    m_file->close();
 
    QString keyboard = QString("키보드 가격 : %L1").arg(keyboardPrice);
    QString monitor = QString("모니터 가격 : %L1").arg(monitorPrice);
 
    ui->textEdit->clear();
 
    ui->textEdit->append(keyboard);
    ui->textEdit->append(monitor);
}
 

 

 

 

답변 1

1

김대진님의 프로필 이미지
김대진
지식공유자

2022. 06. 29. 22:45

안녕하세요. xlql555 님,

slot_pbFileLoad( ) 함수에서 반대로 읽어 들인것 같습니다. 

in >> keyboardPrice;

in >> monitoryPrice;

 

이렇게 읽어 드려야 하는데 

 

in >> monitorPrice;

in >> keyboardPrice;

 

로 읽어오신것 같습니다. 따라서

in >> keyboardPrice;

in >> monitoryPrice;

와 같이 읽어 오시면 값이 제대로 출력된것을 확인하실 수 있습니다. 

혹시 궁금한것 있으면 언제든 문의해 주세요.~ 

 

 

 

 

 

xlql555님의 프로필 이미지
xlql555
질문자

2022. 06. 29. 23:02

늦은 시간에 답변 감사합니다. 제 글이 난해했던 것 같습니다.

 

다시 설명드리면 강사님 말씀처럼 키보드 -> 모니터 순으로 읽어서 출력하면 키보드에 모니터 값이, 모니터에 키보드 값이 서로 바뀌어 읽어들어 출력되는 상황입니다. 

 

위에 올린 코드는 올바른 결과 화면을 출력하기 위해 모니터 -> 키보드 읽기 순으로 잠시 바꾼 코드입니다!

 

김대진님의 프로필 이미지
김대진
지식공유자

2022. 06. 29. 23:10

지금 Qt 6.2.2 버전으로 테스트 해봤는데 그런현상은 발생하지 않했는데요. 첨부해드린 예제를 수정하지 않고 실행해 보실 수 있나요? 

아니면 Endian 때문에 그런경우가 발생할 수 도 있는데요. 만약 데스크탑용 CPU로 쓰는 Intel i7 과 같은 CPU 가 아닌 임베디드 CPU 에서 Endian 문제로 뒤집어 들어가는 경우가 있습니다. 이럴 경우 아래와 같이 Endian 을 지정하실 수 있습니다.

QDataStream dataStream(header);

dataStream.setByteOrder(QDataStream::LittleEndian);

Little Endian 을 사용하는 경우 위와 같이 하시고 Big Endian 의 경우

QDataStream::BigEndian 상수를 사용하시면 됩니다. 

 

 

 

 

xlql555님의 프로필 이미지
xlql555
질문자

2022. 06. 29. 23:18

강사님, 코드 문제가 없는 것 같아 폼을 확인해보니 UI 조작 실수였습니다.

 

늦은 시간에 죄송하고 감사합니다. 2편도 수강하며 궁금한 점 또 질문 남기겠습니다. 좋은 하루 되세요!

김대진님의 프로필 이미지
김대진
지식공유자

2022. 06. 29. 23:21

네~ ^^

궁금한것 있으면 언제든 질문해 주세요. 

xlql555님의 프로필 이미지

작성한 질문수

질문하기