1. Read & Write
QT에서 파일을 읽고 쓰기 위해서는 QFile과 QDataStream 클래스를 이용해서 처리할 수 있다.
Text 같은 경우에는 QTextStream 이라는 클래스를 이용하면 편하다.
참고 자료는 역시 qt-project.org에서 제공하는 document를 보면 된다.
http://qt-project.org/doc/qt-5/qfile.html
2. 주의 사항
: QDateStream을 이용해서 binary data를 읽을 때 주의해야 할 부분이 있다. QT는 default로 BigEndian을 사용한다.
그러나 Windows는 LittleEndian을 사용한다. 그러기 때문에 Windows에서 파일을 읽을 때에는 반듯이 setByteOrder() 함수 세팅을 해줘야 한다.
꼭 QDataStream::LittleEndian 처리를 잊지 말도록 한다.
3. QT에서 제공하지 않는 Struct, Class를 Stream 처리하는 방법
: QDataStream class 자료를 찾아 보면 "Reading and writing other Qt classes" 제목의 단락이 있다. 이 곳의 내용을 참고해서 처리하면 된다.
간단하게 설명하면 stream operator (>>, <<)를 overload 해서 새로 만들어 사용하라는 것이다.
http://qt-project.org/doc/qt-4.8/qdatastream.html
예를 들어 아래와 같은 Struct가 있다고 해보자.
struct TKindValue{ int kind; int value; };
위의 구조체를 QDataStream 객체로 처리하기 위해서는 아래와 같은 operator를 overload한 함수를 만들면 된다.
QDataStream & operator<<(QDataStream& stream, const TKindValue& data) { stream << data.kind << data.value; return stream; } QDataStream & operator>>(QDataStream& stream, TKindValue& data) { stream >> data.kind >> data.value; return stream; }
위와 같이 만든 함수를 사용하는 cpp의 전역 함수로 만들어서 사용하면 된다.
stream을 이용해서 처리를 하다보니 이상한 문제가 발생이 되었다. byteorder가 이상하게 꼬이는 문제이다. 왜 발생하는지 원인은 이 글을 쓰고 있는 현재까지 찾지는 못했다. 파일의 앞부분을 처리할 때 LittleEndian으로 처리하면 정상적으로 데이터가 들어왔는데 중간부터는 안되어 다시 BigEndian으로 바꾸니 문제가 없는 것이다. 왜일까? 테스트 한 파일은 C++ Builder를 통해 제작한 윈도우 프로그램에서 저장한 파일이고 QT는 MSVS를 이용해서 윈도우 상에서 파일을 읽은 것이다.
이런 문제로 아래와 같은 template를 만들어 버렸다. linux에서는 문제가 발생하려나? window에서는 문제가 없었는데 linux에서 처리할 때 재확인을 해봐야 할 것 같다.
template <class T> bool ReadFileFromStream(QDataStream &stream, T &data) { char *buf = 0; int nRet = 0, len = 0; bool bRet = false; len = sizeof(T); buf = new char[len]; memset(buf, 0, len); if (buf) { nRet = stream.readRawData(buf, len); if (nRet == len) { memcpy(&data, buf, len); bRet = true; } else bRet = false; delete[] buf; } buf = 0; return bRet; }
위와 같이 처리를 하면 byteorder를 지정하지 않아도 정상적으로 데이터를 읽어왔다.
'QT and Symbian' 카테고리의 다른 글
QT에서 WinAPI SetFilePointer() 함수 대체 방법 (0) | 2014.12.05 |
---|---|
QT 자료 검색중 찾은 블로그 (0) | 2014.11.11 |
QT 참고 도서 및 SDK 설치 파일 (0) | 2014.09.24 |
5800 테마 홈스크린 아래 버튼 투명화 방법 (0) | 2010.07.27 |
경기도 버스 도착 안내 홈페이지 (0) | 2010.05.17 |