해결된 질문
22.06.29 20:55 작성
·
657
2
안녕하세요. 강의 잘 듣고 있습니다.
현재 최신 버전의 QT Creator를 사용하여 수강중인데, 해당 강의의 경우 가격 정보를 읽어오는 부분에서 차이가 있어서 질문드립니다.
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;
와 같이 읽어 오시면 값이 제대로 출력된것을 확인하실 수 있습니다.
혹시 궁금한것 있으면 언제든 문의해 주세요.~
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 상수를 사용하시면 됩니다.
2022. 06. 29. 23:18
강사님, 코드 문제가 없는 것 같아 폼을 확인해보니 UI 조작 실수였습니다.
늦은 시간에 죄송하고 감사합니다. 2편도 수강하며 궁금한 점 또 질문 남기겠습니다. 좋은 하루 되세요!
2022. 06. 29. 23:02
늦은 시간에 답변 감사합니다. 제 글이 난해했던 것 같습니다.
다시 설명드리면 강사님 말씀처럼 키보드 -> 모니터 순으로 읽어서 출력하면 키보드에 모니터 값이, 모니터에 키보드 값이 서로 바뀌어 읽어들어 출력되는 상황입니다.
위에 올린 코드는 올바른 결과 화면을 출력하기 위해 모니터 -> 키보드 읽기 순으로 잠시 바꾼 코드입니다!