최신 버전에서 QDataStream의 파일 입출력
안녕하세요. 강의 잘 듣고 있습니다.
현재 최신 버전의 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
안녕하세요. xlql555 님,
slot_pbFileLoad( ) 함수에서 반대로 읽어 들인것 같습니다.
in >> keyboardPrice;
in >> monitoryPrice;
이렇게 읽어 드려야 하는데
in >> monitorPrice;
in >> keyboardPrice;
로 읽어오신것 같습니다. 따라서
in >> keyboardPrice;
in >> monitoryPrice;
와 같이 읽어 오시면 값이 제대로 출력된것을 확인하실 수 있습니다.
혹시 궁금한것 있으면 언제든 문의해 주세요.~
0
늦은 시간에 답변 감사합니다. 제 글이 난해했던 것 같습니다.
다시 설명드리면 강사님 말씀처럼 키보드 -> 모니터 순으로 읽어서 출력하면 키보드에 모니터 값이, 모니터에 키보드 값이 서로 바뀌어 읽어들어 출력되는 상황입니다.
위에 올린 코드는 올바른 결과 화면을 출력하기 위해 모니터 -> 키보드 읽기 순으로 잠시 바꾼 코드입니다!

0
지금 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 상수를 사용하시면 됩니다.
0
강사님, 코드 문제가 없는 것 같아 폼을 확인해보니 UI 조작 실수였습니다.
늦은 시간에 죄송하고 감사합니다. 2편도 수강하며 궁금한 점 또 질문 남기겠습니다. 좋은 하루 되세요!

Build system의 Obs 에 관한 질문
1
49
2
강의 재수강 문의
1
68
2
강의 연장 문의
1
92
2
강의 연장 질문
1
75
2
코드 크가가 너무 작은대 이거 화면확대 어떻게 하나요?
0
212
4
Qt6 우분투에서 컴파일 안됨.
1
204
2
Qt5 라이센스 질문(상업적용도)
1
2115
2
Qt creator 환경문제
1
868
2
프로젝트 생성시 kits selection에서 워닝마크
1
276
1
Container Class 관련 질문
1
267
1
하드코딩으로 위젯 구현할 때, 소멸자도 구현해야되나요?
1
441
1
QMainWindow setStatusTip이 적용되지 않습니다
1
323
1
section3 signal-slot 함수부분 이해안됨
1
292
1
윈도우에서 큐티 프로그램 설치 문제
1
704
1
라이선스 관련 문의
1
378
1
QT로 Html이나 PDF 리포트 만드는 방법 문의 드립니다.
2
2173
2
다중선택한 checkbox의 동작을 순차적으로 실행하는 방법 문의
1
325
1
visual stduio ide 환경에서 코드 작성 및 실행 방법
1
434
1
Qt 혹은 QML maps 문의
2
631
1
예제 실습 오타 제보합니다
1
389
1
No documentation available. 이 뜹니다.
1
339
1
리눅스 온라인 인스톨러에서의 설치 항목이 강의 슬라이드와 다릅니다.
1
738
2
Qt Creator 메뉴에 중국어
1
1039
1
qt6 궁금
1
729
1





