Qt 학습 의 길 (56): 바 이 너 리 파일 읽 기와 쓰기

10956 단어
Qt 학습 의 길 (56): 바 이 너 리 파일 읽 기 쓰기 2010 - 04 - 11 17: 29: 39
태그:
Qt
C++
튜 토리 얼
공부 하 다.
오리지널 작품, 전재 허용, 전재 시 반드시 하이퍼링크 형식 으로 문장 표시
원본 출처, 작성 자 정보, 본 성명.그렇지 않 으 면 법 적 책임 을 추궁 할 것 이다.
http://devbean.blog.51cto.com/448512/293892
오늘부터 Qt 의 다른 부분 에 들 어 갑 니 다. 파일 읽 기와 쓰기, 즉 IO 입 니 다.파일 읽 기와 쓰 기 는 많은 응용 프로그램 에서 필요 하 다.Qt 는 QIODevice 를 통 해 IO 의 추상 화 를 제 공 했 는데 이런 장치 (device) 는 바이트 블록 을 읽 는 능력 을 가지 고 있다.자주 사용 하 는 IO 읽 기와 쓰기 종 류 는 다음 과 같은 몇 가 지 를 포함한다.
QFlie
로 컬 파일 시스템 에 접근 하거나 자원 을 삽입 합 니 다.
QTemporaryFile
로 컬 파일 시스템 의 임시 파일 을 만 들 고 접근 합 니 다.
QBuffer
읽 기와 쓰기 QByteArray
QProcess
외부 프로그램 실행, 프로 세 스 간 통신 처리
QTcpSocket
TCP 프로 토 콜 네트워크 데이터 전송
QUdpSocket
UDP 메시지 전송
QSslSocket
SSL / TLS 로 데이터 전송
 QProcess, QTcpSocket, QUdpSoctet, QSslSocket 은 순서대로 장 치 를 방문 합 니 다. 그들의 데 이 터 는 한 번 만 접근 할 수 있 습 니 다. 즉, 첫 번 째 바이트 부터 마지막 바이트 까지 만 접근 할 수 있 습 니 다.QFile, QTemporary File, QBuffer 는 무 작위 접근 장치 입 니 다. 임의의 위치 에서 접근 할 수 있 고 QIODevice: seek () 함수 로 파일 지침 을 다시 찾 을 수 있 습 니 다.
접근 방식 에 있어 서 Qt 는 두 가지 더 높 은 등급 의 추상 을 제공 합 니 다. QDataStream 을 사용 하여 바 이 너 리 방식 으로 접근 하고 QTextStream 을 사용 하여 텍스트 방식 으로 접근 합 니 다.이러한 종 류 는 바이트 순서 와 텍스트 인 코딩 을 제어 하여 프로그래머 가 이런 문제 에서 벗 어 날 수 있 도록 도와 줄 수 있다.
QFile 은 파일 시스템 에서 든 응용 프로그램의 자원 파일 에서 든 독립 된 파일 에 접근 하 는 데 매우 편리 합 니 다.Qt 역시 QDir 와 QFileInfo 두 가지 종 류 를 제공 하여 폴 더 관련 사 무 를 처리 하고 파일 정 보 를 보 는 데 사용 합 니 다.
이번 에는 바 이 너 리 파일 의 읽 기와 쓰기 부터 시작 합 시다.
데이터 에 바 이 너 리 형식 으로 접근 하 는 가장 쉬 운 방법 은 QFile 대상 을 실례 화하 여 파일 을 열 고 QDataStream 을 사용 하여 접근 하 는 것 입 니 다.QDataStream 은 플랫폼 에서 독립 적 으로 데이터 형식 에 접근 하 는 방법 을 제공 합 니 다. 이런 데이터 형식 은 표준 C + + 형식, 예 를 들 어 int, double 등 을 포함 합 니 다.QByteArray, QFont, QImage, QPixmap, QString, QVariant, QList < T > 와 QMap < K, T > 와 같은 다양한 Qt 유형.먼저 다음 코드 를 보십시오.

   
   
   
   
  1. QImage image("philip.png");  
  2.  
  3. QMap<QString, QColor> map;  
  4. map.insert("red", Qt::red);  
  5. map.insert("green", Qt::green);  
  6. map.insert("blue", Qt::blue);  
  7.  
  8. QFile file("facts.dat");  
  9. if (!file.open(QIODevice::WriteOnly)) {  
  10.     std::cerr << "Cannot open file for writing: " 
  11.               << qPrintable(file.errorString()) << std::endl;  
  12.     return;  
  13. }  
  14.  
  15. QDataStream out(&file);  
  16. out.setVersion(QDataStream::Qt_4_3);  
  17.  
  18. out << quint32(0x12345678) << image << map; 

여기 서, 우 리 는 먼저 QImage 대상 을 만 들 었 습 니 다. QMap < QString, QColor > 를 만 든 다음, QFile 을 사용 하여 "facts. dat" 라 는 파일 을 만 든 다음, 쓰기 만 하 는 방식 으로 열 었 습 니 다.열 리 지 못 하면 바로 return;그렇지 않 으 면 QFile 포인터 로 QDataStream 대상 을 만 들 고 version 을 설정 합 니 다. 이것 은 나중에 자세히 설명 하 겠 습 니 다. 마지막 으로 std 의 cout 처럼 < < 연산 자 출력 결 과 를 사용 합 니 다.
0x 12345678 은 '마술 숫자' 가 되 었 는데 이것 은 바 이 너 리 파일 출력 에서 자주 사용 하 는 기술 이다.우리 가 정의 하 는 바 이 너 리 형식 은 보통 이러한 '마술 숫자' 를 가지 고 있 으 며, 표지 파일 형식 에 사용 된다.예 를 들 어 우 리 는 파일 에 0 x 12345678 을 쓰기 시 작 했 습 니 다. 읽 을 때 이 숫자 가 0 x 12345678 인지 먼저 확인 합 니 다. 그렇지 않 으 면 식별 가능 한 형식 이 아니 기 때문에 읽 을 필요 가 없습니다.일반적으로 바 이 너 리 형식 에는 이러한 마술 숫자 가 있 습 니 다. 예 를 들 어 자바 의 class 파일 의 마술 숫자 는 0xCAFE BABE (자바 의 이름) 입 니 다. 바 이 너 리 뷰 어 를 사용 하면 볼 수 있 습 니 다.마술 숫자 는 32 비트 의 부호 없 는 정수 이기 때문에 우 리 는 quint 32 매크로 를 사용 하여 플랫폼 과 무관 한 32 비트 의 부호 없 는 정 수 를 얻 을 수 있 습 니 다.
이 코드 에서 우 리 는 qPrintable () 매크로 를 사 용 했 습 니 다. 이 매크로 는 실제로 QString 대상 을 const char * 로 바 꾸 었 습 니 다.C + + 표준 오류 출력 cerr 를 사용 하고 있 음 을 알 기 때문에 이 변환 을 사용 해 야 합 니 다.물론 QString:: tostdString () 함수 도 같은 동작 을 수행 할 수 있 습 니 다.
읽 는 과정 은 매우 간단 합 니 다. 읽 는 과정 은 기록 하 는 과정 과 일일이 대응 해 야 합 니 다. 즉, 첫 번 째 기록 입 니 다. quint32 모양 의 마술 숫자 는 첫 번 째 로 읽 는 것 도 quint 32 형식의 데이터 여야 합 니 다. 예 를 들 어

   
   
   
   
  1. quint32 n;  
  2. QImage image;  
  3. QMap<QString, QColor> map;  
  4.  
  5. QFile file("facts.dat");  
  6. if (!file.open(QIODevice::ReadOnly)) {  
  7.     std::cerr << "Cannot open file for reading: " 
  8.               << qPrintable(file.errorString()) << std::endl;  
  9.     return;  
  10. }  
  11.  
  12. QDataStream in(&file);  
  13. in.setVersion(QDataStream::Qt_4_3);  
  14.  
  15. in >> n >> image >> map; 

자, 데 이 터 를 읽 었 으 니 가 져 다 쓰 세 요!
이 버 전 은 무엇 에 쓰 입 니까?바 이 너 리 의 읽 기와 쓰기 에 대해 서 는 Qt 버 전이 업그레이드 되면 서 같은 내용 이 읽 기와 쓰기 방식 이 다 를 수 있 습 니 다. 예 를 들 어 큰 쓰기 에서 작은 쓰기 로 바 뀔 수 있 습 니 다. 그러면 오래된 버 전 Qt 가 쓴 내용 을 정확하게 읽 을 수 없 기 때문에 버 전 번 호 를 설정 해 야 합 니 다.예 를 들 어 여기 서 우 리 는 QDataStream:: Qt 를 사용 합 니 다.4_3. Qt 4.3 방식 으로 데 이 터 를 기록 한 다 는 뜻 입 니 다.실제로 현재 최고 버 전 번 호 는 QDataStream:: Qt 입 니 다.4_6。이렇게 쓰 면 4.3 버 전의 Qt 가 파일 내용 을 정확하게 읽 고 쓰 는 것 을 보장 할 수 없다 는 것 이다.그러면 문제 가 생 겼 습 니 다. 우 리 는 하 드 인 코딩 방식 으로 이 version 을 썼 습 니 다. 최신 판 Qt 의 읽 기와 쓰 기 를 사용 할 수 없 지 않 습 니까?
해결 방법 중 하 나 는 마술 숫자 만 쓰 는 것 이 아니 라 이 파일 의 버 전 을 쓰 는 것 이다.예 를 들 면:

   
   
   
   
  1. QFile file("file.xxx");  
  2. file.open(QIODevice::WriteOnly);  
  3. QDataStream out(&file);  
  4.  
  5. // Write a header with a "magic number" and a version  
  6. out << (quint32)0xA0B0C0D0;  
  7. out << (qint32)123;  
  8.  
  9. out.setVersion(QDataStream::Qt_4_0);  
  10.  
  11. // Write the data  
  12. out << lots_of_interesting_data; 

이 file. xxx 파일 의 버 전 번 호 는 123 입 니 다.버 전 번호 가 123 이면 Qt 를 사용 할 수 있다 고 생각 합 니 다.4_0 버 전 읽 기.그래서 우리 의 읽 기 코드 는 판단 이 필요 하 다.

   
   
   
   
  1. QFile file("file.xxx");  
  2.  file.open(QIODevice::ReadOnly);  
  3.  QDataStream in(&file);  
  4.  
  5.  // Read and check the header  
  6.  quint32 magic;  
  7.  in >> magic;  
  8.  if (magic != 0xA0B0C0D0)  
  9.      return XXX_BAD_FILE_FORMAT;  
  10.  
  11.  // Read the version  
  12.  qint32 version;  
  13.  in >> version;  
  14.  if (version < 100)  
  15.      return XXX_BAD_FILE_TOO_OLD;  
  16.  if (version > 123)  
  17.      return XXX_BAD_FILE_TOO_NEW;  
  18.  
  19.  if (version <= 110)  
  20.      in.setVersion(QDataStream::Qt_3_2);  
  21.  else 
  22.      in.setVersion(QDataStream::Qt_4_0);  
  23.  
  24.  // Read the data  
  25.  in >> lots_of_interesting_data;  
  26.  if (version >= 120)  
  27.      in >> data_new_in_XXX_version_1_2;  
  28.  in >> other_interesting_data; 

이렇게 하면 우 리 는 바 이 너 리 형식의 데 이 터 를 비교적 완벽 하 게 처리 할 수 있다.
본 고 는 '콩 공간' 블 로그 에서 나 온 것 이 니, 반드시 이 출처 를 보존 해 주 십시오.http://devbean.blog.51cto.com/448512/293892

좋은 웹페이지 즐겨찾기