QIODevice Class
QIODevice 클래스는 Qt의 모든 I/O 장치의 기본 인터페이스 클래스입니다. 더 보기...
헤더: | #include <QIODevice> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
상속합니다: | QObject 및 QIODeviceBase |
상속받는 사람 | QAbstractSocket, QBluetoothSocket, QBuffer, QCoapReply, QFileDevice, QLocalSocket, QNetworkReply, QProcess, and QSerialPort |
- 상속된 멤버를 포함한 모든 멤버 목록
- QIODevice는 입력/출력 및 네트워킹의 일부입니다.
참고: 이 클래스의 모든 함수는 재진입합니다.
공용 함수
QIODevice() | |
QIODevice(QObject *parent) | |
virtual | ~QIODevice() |
virtual bool | atEnd() const |
virtual qint64 | bytesAvailable() const |
virtual qint64 | bytesToWrite() const |
virtual bool | canReadLine() const |
virtual void | close() |
void | commitTransaction() |
int | currentReadChannel() const |
int | currentWriteChannel() const |
QString | errorString() const |
bool | getChar(char *c) |
bool | isOpen() const |
bool | isReadable() const |
virtual bool | isSequential() const |
bool | isTextModeEnabled() const |
bool | isTransactionStarted() const |
bool | isWritable() const |
virtual bool | open(QIODeviceBase::OpenMode mode) |
QIODeviceBase::OpenMode | openMode() const |
qint64 | peek(char *data, qint64 maxSize) |
QByteArray | peek(qint64 maxSize) |
virtual qint64 | pos() const |
bool | putChar(char c) |
qint64 | read(char *data, qint64 maxSize) |
QByteArray | read(qint64 maxSize) |
QByteArray | readAll() |
int | readChannelCount() const |
qint64 | readLine(char *data, qint64 maxSize) |
QByteArray | readLine(qint64 maxSize = 0) |
virtual bool | reset() |
void | rollbackTransaction() |
virtual bool | seek(qint64 pos) |
void | setCurrentReadChannel(int channel) |
void | setCurrentWriteChannel(int channel) |
void | setTextModeEnabled(bool enabled) |
virtual qint64 | size() const |
qint64 | skip(qint64 maxSize) |
void | startTransaction() |
void | ungetChar(char c) |
virtual bool | waitForBytesWritten(int msecs) |
virtual bool | waitForReadyRead(int msecs) |
qint64 | write(const char *data, qint64 maxSize) |
qint64 | write(const QByteArray &data) |
qint64 | write(const char *data) |
int | writeChannelCount() const |
Signals
void | aboutToClose() |
void | bytesWritten(qint64 bytes) |
void | channelBytesWritten(int channel, qint64 bytes) |
void | channelReadyRead(int channel) |
void | readChannelFinished() |
void | readyRead() |
보호된 함수
virtual qint64 | readData(char *data, qint64 maxSize) = 0 |
virtual qint64 | readLineData(char *data, qint64 maxSize) |
void | setErrorString(const QString &str) |
void | setOpenMode(QIODeviceBase::OpenMode openMode) |
(since 6.0) virtual qint64 | skipData(qint64 maxSize) |
virtual qint64 | writeData(const char *data, qint64 maxSize) = 0 |
상세 설명
QIODevice는 QFile, QBuffer 및 QTcpSocket 와 같은 데이터 블록의 읽기 및 쓰기를 지원하는 장치에 대한 공통 구현과 추상 인터페이스를 모두 제공합니다. QIODevice는 추상적이며 인스턴스화할 수 없지만, 장치에 독립적인 입출력 기능을 제공하기 위해 정의된 인터페이스를 사용하는 것이 일반적입니다. 예를 들어, Qt의 XML 클래스는 QIODevice 포인터에서 작동하므로 다양한 장치(예: 파일 및 버퍼)와 함께 사용할 수 있습니다.
장치에 액세스하기 전에 open()를 호출하여 올바른 OpenMode(예: 읽기 전용 또는 읽기 쓰기)를 설정해야 합니다. 그런 다음 write() 또는 putChar()를 사용하여 장치에 쓰고 read(), readLine() 또는 readAll()를 호출하여 읽을 수 있습니다. 장치 작업을 마치면 close()를 호출합니다.
QIODevice는 무작위 액세스 장치와 순차 액세스 장치의 두 가지 유형의 장치를 구분합니다.
- 무작위 액세스 장치는 seek()를 사용하여 임의의 위치를 찾는 것을 지원합니다. 파일 내 현재 위치는 pos()를 호출하여 확인할 수 있습니다. QFile 및 QBuffer 은 랜덤 액세스 디바이스의 예입니다.
- 순차 장치는 임의 위치 찾기를 지원하지 않습니다. 데이터는 한 번에 읽어야 합니다. pos () 및 size() 함수는 순차 장치에 작동하지 않습니다. QTcpSocket 및 QProcess 은 순차 장치의 예입니다.
isSequential()를 사용하여 장치 유형을 확인할 수 있습니다.
예를 들어 새 데이터가 네트워크에 도착했거나 읽고 있는 파일에 추가 데이터가 추가된 경우와 같이 새 데이터를 읽을 수 있는 경우 QIODevice는 readyRead()를 내보냅니다. bytesAvailable ()를 호출하여 현재 읽을 수 있는 바이트 수를 확인할 수 있습니다. 데이터 조각이 임의의 시점에 도착할 수 있는 QTcpSocket 과 같은 비동기 장치로 프로그래밍할 때는 readyRead() 신호와 함께 bytesAvailable()를 사용하는 것이 일반적입니다. QIODevice는 데이터 페이로드가 장치에 기록될 때마다 bytesWritten() 신호를 보냅니다. bytesToWrite ()를 사용하여 현재 쓰기 대기 중인 데이터의 양을 확인합니다.
QTcpSocket 및 QProcess 과 같은 QIODevice의 특정 서브클래스는 비동기식입니다. 즉, write() 또는 read()와 같은 I/O 함수는 항상 즉시 반환되지만, 제어가 이벤트 루프로 돌아갈 때 장치 자체와의 통신이 발생할 수 있습니다. QIODevice는 호출 스레드를 차단하고 이벤트 루프에 들어가지 않고도 이러한 작업을 즉시 수행하도록 강제할 수 있는 함수를 제공합니다. 이를 통해 이벤트 루프 없이 또는 별도의 스레드에서 QIODevice 서브클래스를 사용할 수 있습니다:
- waitForReadyRead() - 이 함수는 새 데이터를 읽을 수 있을 때까지 호출 스레드에서 작업을 일시 중단합니다.
- waitForBytesWritten() - 이 함수는 하나의 페이로드 데이터가 장치에 기록될 때까지 호출 스레드에서 작업을 일시 중단합니다.
- waitFor....() - QIODevice의 서브클래스는 장치별 작업에 대한 차단 함수를 구현합니다. 예를 들어 QProcess 에는 프로세스가 시작될 때까지 호출 스레드에서 작업을 일시 중단하는 waitForStarted() 함수가 있습니다.
메인 GUI 스레드에서 이러한 함수를 호출하면 사용자 인터페이스가 멈출 수 있습니다. 예시:
QProcess gzip; gzip.start("gzip", QStringList() << "-c"); if (!gzip.waitForStarted()) return false; gzip.write("uncompressed data"); QByteArray compressed; while (gzip.waitForReadyRead()) compressed += gzip.readAll();
QIODevice를 서브클래싱하면 자체 I/O 장치에 동일한 인터페이스를 제공할 수 있습니다. QIODevice의 서브클래스는 보호된 readData() 및 writeData() 함수를 구현하는 데만 필요합니다. QIODevice는 이 함수를 사용하여 getChar(), readLine() 및 write()와 같은 모든 편의 기능을 구현합니다. QIODevice는 액세스 제어도 처리하므로 writeData()가 호출되면 장치가 쓰기 모드로 열려 있다고 안전하게 가정할 수 있습니다.
QFile 및 QTcpSocket 과 같은 일부 서브클래스는 데이터의 중간 저장을 위해 메모리 버퍼를 사용하여 구현됩니다. 이렇게 하면 필요한 장치 액세스 호출 횟수가 줄어들어 속도가 매우 느려지는 경우가 많습니다. 버퍼링을 사용하면 getChar() 및 putChar()와 같은 함수가 디바이스 자체에서 직접 작동하는 대신 메모리 버퍼에서 작동할 수 있으므로 속도가 빨라집니다. 그러나 특정 I/O 작업은 버퍼를 사용하면 제대로 작동하지 않습니다. 예를 들어, 여러 사용자가 동일한 장치를 열어 한 글자씩 읽으면 각각 별도의 청크를 읽어야 할 때 동일한 데이터를 읽게 될 수 있습니다. 이러한 이유로 QIODevice를 사용하면 open()에 Unbuffered 플래그를 전달하여 모든 버퍼링을 우회할 수 있습니다. QIODevice를 서브클래싱할 때는 장치가 언버퍼링 모드에서 열려 있을 때 사용할 수 있는 모든 버퍼를 우회해야 한다는 점을 잊지 마세요.
일반적으로 비동기 장치에서 들어오는 데이터 스트림은 조각화되어 있으며 데이터 청크가 임의의 시점에 도착할 수 있습니다. 데이터 구조의 불완전한 읽기를 처리하려면 QIODevice에서 구현한 트랜잭션 메커니즘을 사용하세요. 자세한 내용은 startTransaction() 및 관련 함수를 참조하세요.
일부 순차 장치는 여러 채널을 통한 통신을 지원합니다. 이러한 채널은 독립적으로 순차적으로 전달되는 속성을 가진 별도의 데이터 스트림을 나타냅니다. 디바이스가 열리면 readChannelCount() 및 writeChannelCount() 함수를 호출하여 채널 수를 확인할 수 있습니다. 채널 간에 전환하려면 setCurrentReadChannel() 및 setCurrentWriteChannel()을 각각 호출합니다. QIODevice는 채널별로 비동기 통신을 처리하기 위한 추가 신호도 제공합니다.
QBuffer, QFile, QTcpSocket 를참조하세요 .
멤버 함수 문서
QIODevice::QIODevice()
QIODevice 객체를 생성합니다.
[explicit]
QIODevice::QIODevice(QObject *parent)
주어진 parent 으로 QIODevice 객체를 생성합니다.
[virtual noexcept]
QIODevice::~QIODevice()
소멸자는 가상이며 QIODevice 은 추상 베이스 클래스입니다. 이 소멸자는 close()를 호출하지 않지만 하위 클래스 소멸자는 호출할 수 있습니다. 확실하지 않은 경우 QIODevice 을 소멸하기 전에 close()를 호출하세요.
[signal]
void QIODevice::aboutToClose()
이 신호는 장치가 닫히려고 할 때 방출됩니다. 장치를 닫기 전에 수행해야 하는 작업이 있는 경우(예: 장치에 기록해야 하는 데이터가 별도의 버퍼에 있는 경우) 이 신호를 연결하세요.
[virtual]
bool QIODevice::atEnd() const
현재 읽기 및 쓰기 위치가 디바이스의 끝에 있는 경우(즉, 디바이스에서 더 이상 읽을 수 있는 데이터가 없는 경우) true
를 반환하고, 그렇지 않으면 false
을 반환합니다.
일부 디바이스의 경우, 읽을 데이터가 더 있음에도 불구하고 atEnd()가 참을 반환할 수 있습니다. 이 특별한 경우는 read() 호출에 대한 직접적인 응답으로 데이터를 생성하는 장치에만 적용됩니다(예: Unix 및 macOS의 /dev
또는 /proc
파일, 모든 플랫폼의 콘솔 입력 / stdin
).
bytesAvailable(), read() 및 isSequential()도 참조하세요 .
[virtual]
qint64 QIODevice::bytesAvailable() const
읽기에 사용할 수 있는 바이트 수를 반환합니다. 이 함수는 일반적으로 순차 장치에서 읽기 전에 버퍼에 할당할 바이트 수를 결정하기 위해 사용됩니다.
이 함수를 재구현하는 서브클래스는 기본 구현을 호출해야 QIODevice 의 버퍼 크기를 포함할 수 있습니다. 예시:
bytesToWrite(), readyRead() 및 isSequential()도 참조하세요 .
[virtual]
qint64 QIODevice::bytesToWrite() const
버퍼가 있는 디바이스의 경우 이 함수는 쓰기를 기다리는 바이트 수를 반환합니다. 버퍼가 없는 장치의 경우, 이 함수는 0을 반환합니다.
이 함수를 재구현하는 서브 클래스는 QIODevice 의 버퍼 크기를 포함하기 위해 기본 구현을 호출해야 합니다.
bytesAvailable(), bytesWritten() 및 isSequential()도 참조하세요 .
[signal]
void QIODevice::bytesWritten(qint64 bytes)
이 신호는 데이터 페이로드가 디바이스의 현재 쓰기 채널에 기록될 때마다 전송됩니다. bytes 인수는 이 페이로드에 기록된 바이트 수로 설정됩니다.
이벤트 루프에 다시 들어가거나 bytesWritten() 신호에 연결된 슬롯 내에서 waitForBytesWritten()를 호출하면 신호는 재귀적으로 다시 전송되지 않습니다( waitForBytesWritten()는 여전히 참을 반환할 수 있음).
readyRead()도 참조하세요 .
[virtual]
bool QIODevice::canReadLine() const
장치에서 전체 데이터 줄을 읽을 수 있으면 true
을 반환하고, 그렇지 않으면 false
을 반환합니다.
읽을 수 있는 항목을 확인할 방법이 없는 버퍼링되지 않은 디바이스는 항상 false를 반환합니다.
이 함수는 종종 readyRead() 신호와 함께 호출됩니다.
이 함수를 재구현하는 서브클래스는 QIODevice 의 버퍼의 내용을 포함하기 위해 기본 구현을 호출해야 합니다. 예시:
bool CustomDevice::canReadLine() const { return buffer.contains('\n') || QIODevice::canReadLine(); }
readyRead() 및 readLine()도 참조하세요 .
[signal]
void QIODevice::channelBytesWritten(int channel, qint64 bytes)
이 신호는 데이터 페이로드가 디바이스에 기록될 때마다 전송됩니다. bytes 인수는 이 페이로드에 쓰여진 바이트 수로 설정되며 channel 은 데이터가 쓰여진 채널입니다. bytesWritten ()와 달리 current write channel.
채널바이트 쓰기()는 같은 채널에 대해서도 재귀적으로 전송될 수 있습니다.
bytesWritten() 및 channelReadyRead()도 참조하세요 .
[signal]
void QIODevice::channelReadyRead(int channel)
이 신호는 디바이스에서 새 데이터를 읽을 수 있을 때 발생합니다. channel 인수는 데이터가 도착한 읽기 채널의 인덱스로 설정됩니다. readyRead ()와는 달리 current read channel.
channelReadyRead()는 동일한 채널에 대해서도 재귀적으로 전송될 수 있습니다.
readyRead() 및 channelBytesWritten()도 참조하세요 .
[virtual]
void QIODevice::close()
먼저 aboutToClose()를 전송한 다음 장치를 닫고 OpenMode를 NotOpen으로 설정합니다. 오류 문자열도 재설정됩니다.
setOpenMode() 및 QIODeviceBase::OpenMode 을참조하세요 .
void QIODevice::commitTransaction()
읽기 트랜잭션을 완료합니다.
순차 장치의 경우 트랜잭션이 진행되는 동안 내부 버퍼에 기록된 모든 데이터가 삭제됩니다.
startTransaction() 및 rollbackTransaction()도 참조하세요 .
int QIODevice::currentReadChannel() const
현재 읽기 채널의 인덱스를 반환합니다.
setCurrentReadChannel(), readChannelCount() 및 QProcess 를참조하세요 .
int QIODevice::currentWriteChannel() const
현재 쓰기 채널의 인덱스를 반환합니다.
setCurrentWriteChannel() 및 writeChannelCount()도 참조하세요 .
QString QIODevice::errorString() const
마지막으로 발생한 장치 오류에 대한 사람이 읽을 수 있는 설명을 반환합니다.
setErrorString()도 참조하세요 .
bool QIODevice::getChar(char *c)
장치에서 한 문자를 읽고 c 에 저장합니다. c 이 nullptr
이면 문자는 버려집니다. 성공하면 true
을 반환하고, 그렇지 않으면 false
을 반환합니다.
read(), putChar() 및 ungetChar()도 참조하세요 .
bool QIODevice::isOpen() const
장치가 열려 있으면 true
을 반환하고, 그렇지 않으면 false
을 반환합니다. 장치를 읽거나 쓸 수 있으면 장치가 열려 있는 것입니다. 기본적으로 이 함수는 openMode()가 NotOpen
을 반환하면 false
을 반환합니다.
openMode() 및 QIODeviceBase::OpenMode도 참조하세요 .
bool QIODevice::isReadable() const
장치에서 데이터를 읽을 수 있으면 true
을 반환하고, 그렇지 않으면 false를 반환합니다. bytesAvailable ()를 사용하여 읽을 수 있는 바이트 수를 확인합니다.
이 함수는 장치의 OpenMode에 ReadOnly 플래그가 포함되어 있는지 확인하는 편의 함수입니다.
openMode() 및 OpenMode 을참조하세요 .
[virtual]
bool QIODevice::isSequential() const
이 장치가 순차적 장치인 경우 true
을 반환하고, 그렇지 않으면 false를 반환합니다.
순차 장치는 무작위 액세스 장치와 달리 시작, 끝, 크기 또는 현재 위치에 대한 개념이 없으며 검색을 지원하지 않습니다. 데이터가 사용 가능하다고 보고할 때만 장치에서 읽을 수 있습니다. 순차 장치의 가장 일반적인 예는 네트워크 소켓입니다. Unix에서는 /dev/zero 및 fifo 파이프와 같은 특수 파일이 순차적입니다.
반면에 일반 파일은 랜덤 액세스를 지원합니다. 일반 파일은 크기와 현재 위치를 모두 가지고 있으며 데이터 스트림에서 앞뒤로 찾는 기능도 지원합니다. 일반 파일은 순차적이지 않습니다.
bytesAvailable()도 참조하세요 .
bool QIODevice::isTextModeEnabled() const
Text 플래그가 활성화된 경우 true
를 반환하고, 그렇지 않으면 false
를 반환합니다.
setTextModeEnabled()도 참조하세요 .
bool QIODevice::isTransactionStarted() const
장치에서 트랜잭션이 진행 중이면 true
을 반환하고, 그렇지 않으면 false
을 반환합니다.
startTransaction()도 참조하세요 .
bool QIODevice::isWritable() const
장치에 데이터를 쓸 수 있으면 true
을 반환하고, 그렇지 않으면 false를 반환합니다.
이 함수는 장치의 OpenMode에 WriteOnly 플래그가 포함되어 있는지 확인하는 편의 함수입니다.
openMode() 및 OpenMode 을참조하세요 .
[virtual]
bool QIODevice::open(QIODeviceBase::OpenMode mode)
장치를 열고 OpenMode를 mode 로 설정합니다. 성공하면 true
을 반환하고, 그렇지 않으면 false
을 반환합니다. 이 함수는 open() 또는 장치를 여는 다른 함수의 재구현에서 호출해야 합니다.
openMode() 및 QIODeviceBase::OpenMode도 참조하세요 .
QIODeviceBase::OpenMode QIODevice::openMode() const
장치가 열린 모드(예: 읽기 전용 또는 쓰기 전용)를 반환합니다.
setOpenMode() 및 OpenMode 을참조하세요 .
qint64 QIODevice::peek(char *data, qint64 maxSize)
부작용 없이 장치에서 data 으로 최대 maxSize 바이트를 읽습니다(즉, peek() 뒤에 read()를 호출하면 동일한 데이터를 얻게 됩니다). 읽은 바이트 수를 반환합니다. 쓰기 전용 모드로 열린 장치를 엿보려고 할 때와 같이 오류가 발생하면 이 함수는 -1을 반환합니다.
읽을 수 있는 데이터가 더 이상 없으면 0이 반환됩니다.
예제:
bool isExeFile(QFile *file) { char buf[2]; if (file->peek(buf, sizeof(buf)) == sizeof(buf)) return (buf[0] == 'M' && buf[1] == 'Z'); return false; }
read()도 참조하세요 .
QByteArray QIODevice::peek(qint64 maxSize)
이 함수는 오버로드된 함수입니다.
장치에서 최대 maxSize 바이트를 들여다보고 들여다본 데이터를 QByteArray 로 반환합니다.
예시:
bool isExeFile(QFile *file) { return file->peek(2) == "MZ"; }
이 함수는 오류를 보고할 방법이 없으므로 빈 QByteArray 을 반환하면 현재 피킹할 수 있는 데이터가 없거나 오류가 발생했음을 의미할 수 있습니다.
read()도 참조하세요 .
[virtual]
qint64 QIODevice::pos() const
랜덤 액세스 장치의 경우 이 함수는 데이터가 쓰여지거나 읽혀지는 위치를 반환합니다. '현재 위치'라는 개념이 없는 순차 장치나 폐쇄형 장치의 경우 0이 반환됩니다.
장치의 현재 읽기/쓰기 위치는 QIODevice 에 의해 내부적으로 유지되므로 이 함수를 다시 구현할 필요가 없습니다. QIODevice 를 서브클래싱할 때는 QIODevice::seek()를 사용하여 QIODevice 에 장치 위치의 변경 사항을 알립니다.
isSequential() 및 seek()도 참조하세요 .
bool QIODevice::putChar(char c)
c 문자를 장치에 씁니다. 성공하면 true
을 반환하고, 그렇지 않으면 false
을 반환합니다.
write(), getChar() 및 ungetChar()도 참조하세요 .
qint64 QIODevice::read(char *data, qint64 maxSize)
장치에서 data 으로 최대 maxSize 바이트를 읽고 읽은 바이트 수를 반환합니다. 쓰기 전용 모드로 열린 장치에서 읽으려고 할 때와 같이 오류가 발생하면 이 함수는 -1을 반환합니다.
더 이상 읽을 수 있는 데이터가 없으면 0이 반환됩니다. 그러나 스트림의 끝을 지나서 읽는 것은 오류로 간주되므로 이러한 경우(즉, 닫힌 소켓에서 읽거나 프로세스가 종료된 후 읽는 경우) 이 함수는 -1을 반환합니다.
readData(), readLine() 및 write()도 참조하세요 .
QByteArray QIODevice::read(qint64 maxSize)
이 함수는 오버로드된 함수입니다.
장치에서 최대 maxSize 바이트를 읽고 읽은 데이터를 QByteArray 로 반환합니다.
이 함수는 오류를 보고할 방법이 없으므로 빈 QByteArray 을 반환하면 현재 읽을 수 있는 데이터가 없거나 오류가 발생했음을 의미할 수 있습니다.
QByteArray QIODevice::readAll()
디바이스에서 남은 모든 데이터를 읽고 바이트 배열로 반환합니다.
이 함수는 오류를 보고할 방법이 없으므로 빈 QByteArray 을 반환하면 현재 읽을 수 있는 데이터가 없거나 오류가 발생했음을 의미할 수 있습니다. 또한 이 함수는 더 많은 데이터를 사용할 수 있었으나 읽지 못했음을 나타낼 수 있는 방법이 없습니다.
int QIODevice::readChannelCount() const
장치가 열려 있으면 사용 가능한 읽기 채널 수를 반환하고, 그렇지 않으면 0을 반환합니다.
writeChannelCount() 및 QProcess 을참조하세요 .
[signal]
void QIODevice::readChannelFinished()
이 신호는 이 장치에서 입력(읽기) 스트림이 닫힐 때 방출됩니다. 닫힘이 감지되는 즉시 발생하므로 read()로 읽을 수 있는 데이터가 아직 남아 있을 수 있습니다.
[pure virtual protected]
qint64 QIODevice::readData(char *data, qint64 maxSize)
장치에서 data 으로 최대 maxSize 바이트를 읽고 읽은 바이트 수 또는 오류가 발생한 경우 -1을 반환합니다.
읽을 바이트가 없고 더 이상 사용할 수 없는 경우(예: 소켓 닫힘, 파이프 닫힘, 하위 프로세스 완료) 이 함수는 -1을 반환합니다.
이 함수는 QIODevice 에 의해 호출됩니다. QIODevice 의 서브클래스를 만들 때 이 함수를 다시 구현하세요.
이 함수를 다시 구현할 때는 반환하기 전에 필요한 모든 데이터를 읽는 것이 중요합니다. 이는 QDataStream 이 클래스에서 작동하기 위해 필요합니다. QDataStream 은 요청된 모든 정보를 읽었다고 가정하므로 문제가 있는 경우 읽기를 다시 시도하지 않습니다.
이 함수는 최대 크기가 0일 때 호출할 수 있으며, 읽기 후 연산을 수행하는 데 사용할 수 있습니다.
read(), readLine() 및 writeData()도 참조하세요 .
qint64 QIODevice::readLine(char *data, qint64 maxSize)
이 함수는 장치에서 최대 maxSize - 1바이트까지 한 줄의 ASCII 문자를 읽고 data 에 문자를 저장한 다음 읽은 바이트 수를 반환합니다. 한 줄을 읽을 수 없었지만 오류가 발생하지 않으면 이 함수는 0을 반환하고, 오류가 발생하면 읽을 수 있는 길이를 반환하고, 아무것도 읽지 않으면 -1을 반환합니다.
data 에는 항상 종료 '\0' 바이트가 추가되므로 maxSize 은 1보다 커야 합니다.
다음 조건 중 하나가 충족될 때까지 데이터를 읽습니다:
- 첫 번째 '\n' 문자가 읽힙니다.
- maxSize - 1바이트가 읽혀집니다.
- 디바이스 데이터의 끝이 감지됩니다.
예를 들어 다음 코드는 파일에서 한 줄의 문자를 읽습니다:
QFile file("box.txt"); if (file.open(QFile::ReadOnly)) { char buf[1024]; qint64 lineLength = file.readLine(buf, sizeof(buf)); if (lineLength != -1) { // the line is available in buf } }
버퍼에 개행 문자('\n')가 포함됩니다. 최대 크기 - 1바이트가 읽히기 전에 개행이 발견되지 않으면 버퍼에 개행이 삽입되지 않습니다. Windows에서는 개행 문자가 '\n'으로 바뀝니다.
순차적 장치에서는 데이터를 즉시 사용할 수 없어 일부 줄이 반환될 수 있습니다. 읽기 전에 canReadLine() 함수를 호출하면 전체 줄(개행 문자 포함)을 읽을 수 있는지 확인할 수 있습니다.
이 함수는 readLineData()를 호출하며, getChar()를 반복적으로 호출하여 구현됩니다. 자체 서브클래스에서 readLineData()를 다시 구현하면 더 효율적인 구현을 제공할 수 있습니다.
getChar(), read(), canReadLine() 및 write()도 참조하세요 .
QByteArray QIODevice::readLine(qint64 maxSize = 0)
이 함수는 오버로드된 함수입니다.
장치에서 한 줄( maxSize 문자 이하)을 읽고 결과를 바이트 배열로 반환합니다.
maxSize 이 0이거나 지정하지 않으면 줄의 길이에 제한이 없으므로 무제한으로 읽을 수 있습니다.
결과 줄에 줄 끝 문자("\n" 또는 "\r\n")가 있을 수 있으므로 QByteArray::trimmed()를 호출해야 할 수도 있습니다.
이 함수는 오류를 보고하는 방법이 없으므로 빈 QByteArray 을 반환하면 현재 읽을 수 있는 데이터가 없거나 오류가 발생했음을 의미할 수 있습니다.
[virtual protected]
qint64 QIODevice::readLineData(char *data, qint64 maxSize)
data 으로 최대 maxSize 문자를 읽고 읽은 문자 수를 반환합니다.
이 함수는 readLine()에 의해 호출되며 getChar()을 사용하여 기본 구현을 제공합니다. 버퍼링된 장치는 이 함수를 다시 구현하여 readLine()의 성능을 향상시킬 수 있습니다.
readLine()는 data 에 '\0' 바이트를 추가하지만, readLineData()는 이 작업을 수행할 필요가 없습니다.
이 함수를 다시 구현하는 경우 올바른 값을 반환하도록 주의하세요. 종료 줄 바꿈을 포함하여 이 줄에서 읽은 바이트 수를 반환하거나 이 시점에서 읽을 줄이 없는 경우 0을 반환해야 합니다. 오류가 발생하면 읽은 바이트가 없는 경우에만 -1을 반환해야 합니다. EOF를 지나서 읽는 것은 오류로 간주됩니다.
[signal]
void QIODevice::readyRead()
이 신호는 디바이스의 현재 읽기 채널에서 새 데이터를 읽을 수 있을 때마다 한 번씩 전송됩니다. 네트워크 데이터의 새 페이로드가 네트워크 소켓에 도착하거나 새 데이터 블록이 장치에 추가된 경우와 같이 새 데이터를 사용할 수 있을 때만 다시 발생합니다.
readyRead() 신호에 연결된 슬롯 내에서 이벤트 루프에 다시 들어가거나 waitForReadyRead()를 호출하면 신호가 재귀적으로 다시 전송되지 않습니다( waitForReadyRead()는 여전히 참을 반환할 수 있지만).
QIODevice 에서 파생된 클래스를 구현하는 개발자를 위한 참고 사항: 새 데이터가 도착했을 때 항상 readyRead() 신호를 전송해야 합니다(버퍼에 아직 읽을 데이터가 있다고 해서 전송하지 마세요). 다른 조건에서는 readyRead()를 발생시키지 마세요.
bytesWritten()도 참조하세요 .
[virtual]
bool QIODevice::reset()
랜덤 액세스 디바이스에 대한 입력 시작점을 찾습니다. 성공하면 true를 반환하고, 그렇지 않으면 false
(예: 장치가 열려 있지 않은 경우)를 반환합니다.
QFile 에서 QTextStream 을 사용하는 경우 QFile 에서 reset()을 호출하면 QTextStream 이 파일을 버퍼링하므로 예상한 결과를 얻을 수 없습니다. 대신 QTextStream::seek() 함수를 사용하세요.
seek()도 참조하세요 .
void QIODevice::rollbackTransaction()
읽기 트랜잭션을 롤백합니다.
입력 스트림을 startTransaction() 호출 시점으로 복원합니다. 이 함수는 일반적으로 트랜잭션을 커밋하기 전에 불완전한 읽기가 감지된 경우 트랜잭션을 롤백하는 데 사용됩니다.
startTransaction() 및 commitTransaction()도 참조하세요 .
[virtual]
bool QIODevice::seek(qint64 pos)
랜덤 액세스 장치의 경우 이 함수는 현재 위치를 pos 로 설정하여 성공 시 참을 반환하고 오류가 발생하면 거짓을 반환합니다. 순차적 장치의 경우 기본 동작은 경고를 생성하고 false를 반환하는 것입니다.
QIODevice 을 서브클래싱할 때는 QIODevice 의 내장 버퍼와 무결성을 보장하기 위해 함수 시작 부분에 QIODevice::seek()를 호출해야 합니다.
pos() 및 isSequential()도 참조하세요 .
void QIODevice::setCurrentReadChannel(int channel)
QIODevice 의 현재 읽기 채널을 지정된 channel 으로 설정합니다. 현재 입력 채널은 read(), readAll(), readLine() 및 getChar() 함수에서 사용됩니다. 또한 QIODevice 을 트리거하여 readyRead() 을 방출할 채널도 결정합니다.
currentReadChannel(), readChannelCount() 및 QProcess도 참조하세요 .
void QIODevice::setCurrentWriteChannel(int channel)
QIODevice 의 현재 쓰기 채널을 지정된 channel 으로 설정합니다. 현재 출력 채널은 write(), putChar() 함수에서 사용됩니다. 또한 QIODevice 을 트리거하여 bytesWritten() 을 방출할 채널도 결정합니다.
currentWriteChannel() 및 writeChannelCount()도 참조하세요 .
[protected]
void QIODevice::setErrorString(const QString &str)
마지막으로 발생한 장치 오류에 대한 사람이 읽을 수 있는 설명을 str 으로 설정합니다.
errorString()도 참조하세요 .
[protected]
void QIODevice::setOpenMode(QIODeviceBase::OpenMode openMode)
디바이스의 OpenMode를 openMode 로 설정합니다. 장치를 연 후 플래그가 변경되면 이 함수를 호출하여 열기 모드를 설정합니다.
openMode() 및 OpenMode도 참조하세요 .
void QIODevice::setTextModeEnabled(bool enabled)
enabled 이 참이면 이 함수는 장치에 Text 플래그를 설정하고, 그렇지 않으면 Text 플래그가 제거됩니다. 이 기능은 QIODevice 에서 사용자 지정 줄 끝 처리를 제공하는 클래스에 유용합니다.
이 함수를 호출하기 전에 IO 장치를 열어야 합니다.
isTextModeEnabled(), open() 및 setOpenMode()도 참조하세요 .
[virtual]
qint64 QIODevice::size() const
개방형 랜덤 액세스 디바이스의 경우 이 함수는 디바이스의 크기를 반환합니다. 개방형 순차 장치의 경우 bytesAvailable()가 반환됩니다.
장치가 닫혀 있는 경우 반환되는 크기는 장치의 실제 크기를 반영하지 않습니다.
isSequential() 및 pos()도 참조하세요 .
qint64 QIODevice::skip(qint64 maxSize)
디바이스에서 최대 maxSize 바이트까지 건너뜁니다. 실제로 건너뛴 바이트 수(오류 시 -1)를 반환합니다.
이 함수는 대기하지 않고 이미 읽을 수 있는 데이터만 삭제합니다.
디바이스가 텍스트 모드에서 열리면 줄 끝 종결자는 '\n' 기호로 변환되며 read() 및 peek() 동작과 동일하게 단일 바이트로 계산됩니다.
이 기능은 seek()를 사용할 수 없는 순차적 장치를 포함한 모든 장치에서 작동합니다. peek () 호출 후 원하지 않는 데이터를 건너뛰도록 최적화되어 있습니다.
랜덤 액세스 디바이스의 경우 skip()을 사용하여 현재 위치에서 앞으로 탐색할 수 있습니다. 음수 maxSize 값은 허용되지 않습니다.
skipData(), peek(), seek() 및 read()도 참조하세요 .
[virtual protected, since 6.0]
qint64 QIODevice::skipData(qint64 maxSize)
디바이스에서 최대 maxSize 바이트까지 건너뜁니다. 실제로 건너뛴 바이트 수 또는 오류 시 -1을 반환합니다.
이 함수는 QIODevice 에 의해 호출됩니다. QIODevice 의 서브클래스를 만들 때 이 함수를 다시 구현하는 것을 고려하세요.
기본 구현은 더미 버퍼로 읽어 데이터를 삭제합니다. 이 방법은 느리지만 모든 유형의 기기에서 작동합니다. 서브클래스는 이 함수를 재구현하여 이를 개선할 수 있습니다.
이 함수는 Qt 6.0에 도입되었습니다.
skip(), peek(), seek() 및 read()도 참조하십시오 .
void QIODevice::startTransaction()
장치에서 새 읽기 트랜잭션을 시작합니다.
읽기 작업 시퀀스 내에서 복구 가능한 지점을 정의합니다. 순차적 장치의 경우 읽기 데이터가 내부적으로 복제되어 불완전한 읽기가 발생할 경우 복구할 수 있습니다. 랜덤 액세스 장치의 경우, 이 함수는 현재 위치를 저장합니다. commitTransaction () 또는 rollbackTransaction()를 호출하여 트랜잭션을 완료합니다.
참고: 중첩 트랜잭션은 지원되지 않습니다.
commitTransaction() 및 rollbackTransaction()도 참조하세요 .
void QIODevice::ungetChar(char c)
c 문자를 장치에 다시 넣고 위치가 0이 아니면 현재 위치를 감소시킵니다. 이 함수는 일반적으로 역추적 파서를 작성할 때와 같이 getChar() 작업을 "실행 취소"하기 위해 호출됩니다.
c 을 이전에 디바이스에서 읽지 않았다면 동작이 정의되지 않습니다.
참고: 트랜잭션이 진행 중일 때는 이 함수를 사용할 수 없습니다.
[virtual]
bool QIODevice::waitForBytesWritten(int msecs)
버퍼링된 장치의 경우 이 함수는 버퍼링된 쓰기 데이터의 페이로드가 장치에 쓰여지고 bytesWritten() 신호가 전송될 때까지 또는 msecs 밀리초가 경과할 때까지 대기합니다. msecs가 -1이면 이 함수는 시간 초과되지 않습니다. 버퍼링되지 않은 디바이스의 경우 즉시 반환됩니다.
데이터 페이로드가 장치에 기록된 경우 true
을 반환하고, 그렇지 않으면 false
을 반환합니다(즉, 작업 시간이 초과되었거나 오류가 발생한 경우).
이 함수는 이벤트 루프 없이 작동할 수 있습니다. 이 함수는 비-GUI 애플리케이션을 작성하거나 비-GUI 스레드에서 I/O 작업을 수행할 때 유용합니다.
bytesWritten() 신호에 연결된 슬롯 내에서 호출하면 bytesWritten() 신호가 다시 전송되지 않습니다.
이 함수를 다시 구현하여 사용자 지정 장치에 대한 차단 API를 제공합니다. 기본 구현은 아무 작업도 수행하지 않고 false
을 반환합니다.
경고: 메인(GUI) 스레드에서 이 함수를 호출하면 사용자 인터페이스가 멈출 수 있습니다.
waitForReadyRead()도 참조하세요 .
[virtual]
bool QIODevice::waitForReadyRead(int msecs)
새 데이터를 읽을 수 있고 readyRead() 신호가 전송될 때까지 또는 msecs 밀리초가 경과할 때까지 차단합니다. msecs가 -1이면 이 함수는 시간 초과되지 않습니다.
새 데이터를 읽을 수 있는 경우 true
을 반환하고, 그렇지 않으면 (작업 시간이 초과되었거나 오류가 발생한 경우) false 를 반환합니다.
이 함수는 이벤트 루프 없이 작동할 수 있습니다. 이 함수는 비-GUI 애플리케이션을 작성하거나 비-GUI 스레드에서 I/O 작업을 수행할 때 유용합니다.
readyRead() 신호에 연결된 슬롯 내에서 호출하면 readyRead() 신호가 다시 전송되지 않습니다.
이 함수를 다시 구현하여 사용자 지정 장치에 대한 차단 API를 제공합니다. 기본 구현은 아무 작업도 수행하지 않고 false
을 반환합니다.
경고: 메인(GUI) 스레드에서 이 함수를 호출하면 사용자 인터페이스가 멈출 수 있습니다.
waitForBytesWritten()도 참조하세요 .
qint64 QIODevice::write(const char *data, qint64 maxSize)
data 에서 디바이스로 최대 maxSize 바이트의 데이터를 씁니다. 실제로 쓰여진 바이트 수 또는 오류가 발생한 경우 -1을 반환합니다.
qint64 QIODevice::write(const QByteArray &data)
과부하가 걸린 기능입니다.
data 의 콘텐츠를 장치에 씁니다. 실제로 쓰여진 바이트 수를 반환하거나 오류가 발생한 경우 -1을 반환합니다.
qint64 QIODevice::write(const char *data)
이 함수는 오버로드된 함수입니다.
0으로 끝나는 8비트 문자로 구성된 문자열의 데이터를 장치에 씁니다. 실제로 쓰여진 바이트 수 또는 오류가 발생한 경우 -1을 반환합니다. 이는 다음과 같습니다.
... QIODevice::write(data, qstrlen(data)); ...
int QIODevice::writeChannelCount() const
장치가 열려 있으면 사용 가능한 쓰기 채널 수를 반환하고, 그렇지 않으면 0을 반환합니다.
readChannelCount()도 참조하세요 .
[pure virtual protected]
qint64 QIODevice::writeData(const char *data, qint64 maxSize)
data 에서 장치로 최대 maxSize 바이트까지 씁니다. 쓴 바이트 수를 반환하거나 오류가 발생하면 -1을 반환합니다.
이 함수는 QIODevice 에 의해 호출됩니다. QIODevice 의 서브클래스를 만들 때 이 함수를 다시 구현하세요.
이 함수를 다시 구현할 때는 반환하기 전에 사용 가능한 모든 데이터를 쓰는 것이 중요합니다. 이는 QDataStream 이 클래스에서 작동하기 위해 필요합니다. QDataStream 은 모든 정보가 쓰여졌다고 가정하므로 문제가 있는 경우 다시 쓰기를 시도하지 않습니다.
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.