Qt 학습 의 길 (56): 바 이 너 리 파일 읽 기와 쓰기
태그:
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 유형.먼저 다음 코드 를 보십시오.
- QImage image("philip.png");
-
- QMap<QString, QColor> map;
- map.insert("red", Qt::red);
- map.insert("green", Qt::green);
- map.insert("blue", Qt::blue);
-
- QFile file("facts.dat");
- if (!file.open(QIODevice::WriteOnly)) {
- std::cerr << "Cannot open file for writing: "
- << qPrintable(file.errorString()) << std::endl;
- return;
- }
-
- QDataStream out(&file);
- out.setVersion(QDataStream::Qt_4_3);
-
- 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 형식의 데이터 여야 합 니 다. 예 를 들 어
- quint32 n;
- QImage image;
- QMap<QString, QColor> map;
-
- QFile file("facts.dat");
- if (!file.open(QIODevice::ReadOnly)) {
- std::cerr << "Cannot open file for reading: "
- << qPrintable(file.errorString()) << std::endl;
- return;
- }
-
- QDataStream in(&file);
- in.setVersion(QDataStream::Qt_4_3);
-
- in >> n >> image >> map;
자, 데 이 터 를 읽 었 으 니 가 져 다 쓰 세 요!
이 버 전 은 무엇 에 쓰 입 니까?바 이 너 리 의 읽 기와 쓰기 에 대해 서 는 Qt 버 전이 업그레이드 되면 서 같은 내용 이 읽 기와 쓰기 방식 이 다 를 수 있 습 니 다. 예 를 들 어 큰 쓰기 에서 작은 쓰기 로 바 뀔 수 있 습 니 다. 그러면 오래된 버 전 Qt 가 쓴 내용 을 정확하게 읽 을 수 없 기 때문에 버 전 번 호 를 설정 해 야 합 니 다.예 를 들 어 여기 서 우 리 는 QDataStream:: Qt 를 사용 합 니 다.4_3. Qt 4.3 방식 으로 데 이 터 를 기록 한 다 는 뜻 입 니 다.실제로 현재 최고 버 전 번 호 는 QDataStream:: Qt 입 니 다.4_6。이렇게 쓰 면 4.3 버 전의 Qt 가 파일 내용 을 정확하게 읽 고 쓰 는 것 을 보장 할 수 없다 는 것 이다.그러면 문제 가 생 겼 습 니 다. 우 리 는 하 드 인 코딩 방식 으로 이 version 을 썼 습 니 다. 최신 판 Qt 의 읽 기와 쓰 기 를 사용 할 수 없 지 않 습 니까?
해결 방법 중 하 나 는 마술 숫자 만 쓰 는 것 이 아니 라 이 파일 의 버 전 을 쓰 는 것 이다.예 를 들 면:
- QFile file("file.xxx");
- file.open(QIODevice::WriteOnly);
- QDataStream out(&file);
-
- // Write a header with a "magic number" and a version
- out << (quint32)0xA0B0C0D0;
- out << (qint32)123;
-
- out.setVersion(QDataStream::Qt_4_0);
-
- // Write the data
- out << lots_of_interesting_data;
이 file. xxx 파일 의 버 전 번 호 는 123 입 니 다.버 전 번호 가 123 이면 Qt 를 사용 할 수 있다 고 생각 합 니 다.4_0 버 전 읽 기.그래서 우리 의 읽 기 코드 는 판단 이 필요 하 다.
- QFile file("file.xxx");
- file.open(QIODevice::ReadOnly);
- QDataStream in(&file);
-
- // Read and check the header
- quint32 magic;
- in >> magic;
- if (magic != 0xA0B0C0D0)
- return XXX_BAD_FILE_FORMAT;
-
- // Read the version
- qint32 version;
- in >> version;
- if (version < 100)
- return XXX_BAD_FILE_TOO_OLD;
- if (version > 123)
- return XXX_BAD_FILE_TOO_NEW;
-
- if (version <= 110)
- in.setVersion(QDataStream::Qt_3_2);
- else
- in.setVersion(QDataStream::Qt_4_0);
-
- // Read the data
- in >> lots_of_interesting_data;
- if (version >= 120)
- in >> data_new_in_XXX_version_1_2;
- in >> other_interesting_data;
이렇게 하면 우 리 는 바 이 너 리 형식의 데 이 터 를 비교적 완벽 하 게 처리 할 수 있다.
본 고 는 '콩 공간' 블 로그 에서 나 온 것 이 니, 반드시 이 출처 를 보존 해 주 십시오.http://devbean.blog.51cto.com/448512/293892
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.