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, 그리고 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) |
(since 6.9) QByteArrayView | readLineInto(QSpan<char> buffer) |
(since 6.9) QByteArrayView | readLineInto(QSpan<std::byte> buffer) |
(since 6.9) QByteArrayView | readLineInto(QSpan<uchar> buffer) |
(since 6.9) bool | readLineInto(QByteArray *line, 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 |
신호
| 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는 추상 클래스이므로 인스턴스화할 수 없지만, 이 클래스가 정의하는 인터페이스를 사용하여 장치 독립적인 I/O 기능을 제공하는 것이 일반적입니다. 예를 들어, Qt XML 클래스는 QIODevice 포인터를 기반으로 작동하므로 다양한 장치(파일 및 버퍼 등)와 함께 사용할 수 있습니다.
장치에 액세스하기 전에 open()를 호출하여 올바른 OpenMode(예: ReadOnly 또는 ReadWrite)를 설정해야 합니다. 그런 다음 write() 또는 putChar()를 사용하여 장치에 데이터를 쓸 수 있으며, read(), readLine() 또는 readAll()를 호출하여 데이터를 읽을 수 있습니다. 장치 사용이 끝나면 close()를 호출하십시오.
QIODevice는 임의 접근 장치와 순차 접근 장치, 두 가지 유형의 장치를 구분합니다.
- 임의 접근 장치는 seek()를 사용하여 임의의 위치로 이동할 수 있습니다. 파일의 현재 위치는 pos()를 호출하여 확인할 수 있습니다. QFile 및 QBuffer 는 임의 접근 장치의 예입니다.
- 순차 장치(Sequential devices)는 임의 위치로의 이동을 지원하지 않습니다. 데이터는 한 번에 모두 읽어야 합니다. pos() 및 size() 함수는 순차 장치에서는 작동하지 않습니다. QTcpSocket 및 QProcess 는 순차 장치의 예입니다.
isSequential()을 사용하여 장치의 유형을 확인할 수 있습니다.
QIODevice는 읽을 수 있는 새 데이터가 있을 때 readyRead()를 발생시킵니다. 예를 들어, 네트워크에 새 데이터가 도착했거나 읽고 있는 파일에 추가 데이터가 덧붙여진 경우입니다. bytesAvailable()를 호출하여 현재 읽을 수 있는 바이트 수를 확인할 수 있습니다. QTcpSocket 와 같이 데이터 조각이 임의의 시점에 도착할 수 있는 비동기식 장치로 프로그래밍할 때는 bytesAvailable()를 readyRead() 신호와 함께 사용하는 것이 일반적입니다. 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의 하위 클래스는 protected readData() 및 writeData() 함수만 구현하면 됩니다. QIODevice는 이러한 함수를 사용하여 getChar(), readLine() 및 write()과 같은 모든 편의 함수를 구현합니다. 또한 QIODevice는 액세스 제어를 자동으로 처리하므로, writeData()가 호출되면 장치가 쓰기 모드로 열렸다고 안전하게 가정할 수 있습니다.
QFile 및 QTcpSocket 와 같은 일부 하위 클래스는 데이터를 중간 저장하기 위해 메모리 버퍼를 사용하여 구현됩니다. 이를 통해 종종 매우 느린 장치 액세스 호출 횟수를 줄일 수 있습니다. 버퍼링을 사용하면 getChar() 및 putChar()와 같은 함수가 장치 자체에 직접 접근하는 대신 메모리 버퍼에서 작동할 수 있으므로 처리 속도가 빨라집니다. 그러나 특정 I/O 작업은 버퍼와 잘 호환되지 않습니다. 예를 들어, 여러 사용자가 동일한 장치를 열고 한 글자씩 읽을 경우, 각자 별도의 데이터 청크를 읽으려 했음에도 결국 동일한 데이터를 읽게 될 수 있습니다. 이러한 이유로, QIODevice는 open()에 Unbuffered 플래그를 전달하여 모든 버퍼링을 우회할 수 있도록 합니다. QIODevice를 서브클래스화할 때는, 장치가 Unbuffered 모드로 열려 있을 때 사용할 수 있는 모든 버퍼를 우회해야 한다는 점을 명심하십시오.
일반적으로 비동기 장치에서 들어오는 데이터 스트림은 조각화되어 있으며, 데이터 청크는 임의의 시점에 도착할 수 있습니다. 데이터 구조의 불완전한 읽기를 처리하려면 QIODevice에서 구현된 트랜잭션 메커니즘을 사용하십시오. 자세한 내용은 ` startTransaction()` 및 관련 함수를 참조하십시오.
일부 순차 장치는 여러 채널을 통한 통신을 지원합니다. 이러한 채널은 독립적으로 순차 전달되는 특성을 가진 별도의 데이터 스트림을 나타냅니다. 장치가 열리면 readChannelCount() 및 writeChannelCount() 함수를 호출하여 채널 수를 확인할 수 있습니다. 채널 간 전환을 하려면 각각 setCurrentReadChannel() 및 setCurrentWriteChannel()을 호출하십시오. QIODevice는 또한 채널별로 비동기 통신을 처리하기 위한 추가 신호를 제공합니다.
보안 고려 사항
QIODevice에는 제한 없는 읽기를 가능하게 하는 일련의 메서드가 있습니다. 이 문서를 작성하는 시점에서 이러한 메서드에는 readAll(), readLine(0) 및 readLineInto(buffer, 0) 가 포함되며, 후자의 두 메서드는 0 값에 대해 특별한 의미를 가지며 이를 무제한으로 취급합니다.
순차적 장치의 경우, 또는 size()의 반환값이 0인 장치(예: /dev/urandom)의 경우, 이 메서드들은 새로운 데이터가 있는 한 데이터를 청크 단위로 읽어 내부 버퍼나 사용자가 제공한 버퍼에 추가합니다. 이로 인해 메모리 부족 상황이 발생할 수 있습니다. 따라서 신뢰할 수 없는 입력이나 크기가 알려지지 않은 입력의 경우 이러한 메서드 사용을 피하고, 읽기 작업에 대해 항상 합리적인 상한값을 지정하는 것이 권장됩니다.
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()가 true를 반환할 수 있습니다. 이 특수한 경우는 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()은 재귀적으로 발생하지 않습니다. bytesWritten() 신호에 연결된 슬롯 내에서 이벤트 루프에 재진입하거나 waitForBytesWritten()을 호출하더라도, 이 신호는 다시 발생하지 않습니다(단, waitForBytesWritten()은 여전히 true를 반환할 수 있습니다).
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` 설정과 관계없이 발생합니다.
channelBytesWritten()은 동일한 채널에 대해서도 재귀적으로 발생될 수 있습니다.
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`를 반환합니다.
순차 장치는 랜덤 액세스 장치와 달리 시작, 끝, 크기 또는 현재 위치라는 개념이 없으며, 시킹을 지원하지 않습니다. 데이터가 사용 가능하다고 보고될 때만 해당 장치에서 읽을 수 있습니다. 순차 장치의 가장 일반적인 예는 네트워크 소켓입니다. 유닉스에서는 /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
장치가 어떤 모드로 열렸는지, 즉 ReadOnly 또는 WriteOnly를 반환합니다.
setOpenMode() 및 OpenMode도 참조하십시오 .
qint64 QIODevice::peek(char *data, qint64 maxSize)
이 함수는 장치에서 최대 maxSize 바이트를 data 로 읽어오며, 부수 효과가 없습니다(즉, peek() 호출 후 read()를 호출하더라도 동일한 데이터를 얻게 됩니다). 읽은 바이트 수를 반환합니다. WriteOnly 모드로 열린 장치를 peek하려고 시도하는 경우와 같이 오류가 발생하면, 이 함수는 -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)
장치에서 최대 maxSize 바이트를 data 로 읽어들이고, 읽은 바이트 수를 반환합니다. WriteOnly 모드로 열린 장치에서 읽으려는 경우와 같이 오류가 발생하면, 이 함수는 -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)
장치에서 최대 maxSize 바이트를 data 로 읽어들이고, 읽은 바이트 수를 반환하며, 오류가 발생한 경우 -1을 반환합니다.
읽을 바이트가 없고, 앞으로 더 이상 바이트를 읽을 수 없는 경우(예: 소켓이 닫혔거나, 파이프가 닫혔거나, 하위 프로세스가 종료된 경우 등), 이 함수는 -1을 반환합니다.
이 함수는 QIODevice 에 의해 호출됩니다. QIODevice 의 서브클래스를 생성할 때 이 함수를 재구현하십시오.
이 함수를 재구현할 때는 반환하기 전에 필요한 모든 데이터를 읽어들이는 것이 중요합니다. 이는 ` QDataStream `가 해당 클래스에 대해 작업을 수행할 수 있도록 하기 위해 필요합니다. ` QDataStream `는 요청된 모든 정보가 읽혀졌다고 가정하므로, 문제가 발생하더라도 읽기를 재시도하지 않습니다.
이 함수는 maxSize가 0인 상태로 호출될 수 있으며, 이는 읽기 후 작업을 수행하는 데 사용될 수 있습니다.
read(), readLine(), writeData()도 참조하십시오 .
qint64 QIODevice::readLine(char *data, qint64 maxSize)
이 함수는 장치에서 최대 maxSize - 1바이트 분량의 ASCII 문자 한 줄을 읽어와, 해당 문자를 data 에 저장한 뒤, 읽은 바이트 수를 반환합니다. 한 줄을 읽을 수 없었지만 오류가 발생하지 않은 경우, 이 함수는 0을 반환합니다. 오류가 발생한 경우, 이 함수는 읽을 수 있었던 데이터의 길이를 반환하며, 아무것도 읽지 못한 경우에는 -1을 반환합니다.
종료 바이트 '\0'는 항상 data 에 추가되므로, 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')가 포함됩니다. maxSize - 1바이트를 읽기 전에 줄바꿈 문자가 발견되지 않으면, 버퍼에 줄바꿈 문자가 삽입되지 않습니다.
참고: 줄바꿈 변환(예: ' \r '을 ' \n'로 변환)은 QIODevice::Text 플래그를 사용하여 장치를 읽기 모드로 열었을 때만 수행됩니다.
순차 장치에서는 데이터를 즉시 사용할 수 없을 수 있으며, 이로 인해 줄의 일부만 반환될 수 있습니다. 읽기 전에 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)
maxSize 까지의 문자를 data 에 읽어들이고, 읽은 문자 수를 반환합니다.
이 함수는 ` readLine()`에 의해 호출되며, ` getChar()`를 사용하여 기본 구현을 제공합니다. 버퍼링된 장치는 이 함수를 재구현함으로써 ` readLine()`의 성능을 향상시킬 수 있습니다.
readLine()는 data 에 '\0' 바이트를 추가하지만, readLineData()는 이 작업을 수행할 필요가 없습니다.
이 함수를 재구현할 경우 올바른 값을 반환하도록 주의해야 합니다. 이 함수는 줄 끝의 개행 문자를 포함하여 해당 줄에서 읽은 바이트 수를 반환해야 하며, 해당 지점에서 읽을 줄이 없는 경우에는 0을 반환해야 합니다. 오류가 발생한 경우, 바이트가 하나도 읽히지 않은 경우에만 -1을 반환해야 합니다. EOF를 넘어 읽은 경우 오류로 간주됩니다.
[since 6.9] QByteArrayView QIODevice::readLineInto(QSpan<char> buffer)
[since 6.9] QByteArrayView QIODevice::readLineInto(QSpan<std::byte> buffer)
[since 6.9] QByteArrayView QIODevice::readLineInto(QSpan<uchar> buffer)
이 장치에서 한 줄을 읽어 buffer 에 저장하고, 읽은 데이터가 포함된 buffer 의 부분 집합을 반환합니다.
buffer 의 크기가 줄의 길이보다 작으면, buffer 에 들어갈 수 있는 문자만 읽어서 반환합니다. 이 경우, readLineInto()을 다시 호출하면 줄의 나머지 부분을 가져올 수 있습니다. 줄 전체가 읽혔는지 확인하려면, 마지막 줄이 줄바꿈 문자로 끝나지 않은 경우를 대비하여 먼저 장치가 atEnd() 상태인지 확인하십시오. 그렇지 않은 경우( atEnd()), 반환된 뷰가 '\n'로 끝나는지 확인하십시오. 그렇지 않으면 readLineInto()를 다시 호출해야 합니다.
결과 줄의 끝에 줄바꿈 문자가 있을 수 있으므로("\n" 또는 "\r\n "), QByteArrayView::trimmed()를 호출해야 할 수도 있습니다.
오류가 발생한 경우, 이 함수는 null QByteArrayView 를 반환합니다. 그렇지 않은 경우, buffer 의 하위 스팬을 반환합니다. 현재 읽을 수 있는 데이터가 없거나 장치가 atEnd()인 경우, 이 함수는 빈 QByteArrayView 를 반환합니다.
반환 값은 null로 종료되지 않는다는 점에 유의하십시오. null로 종료된 값을 원한다면 buffer.chopped(1) 를 전달한 다음, buffer[result.size()] 위치에 '\0'를 삽입하면 됩니다.
이 함수들은 Qt 6.9에서 도입되었습니다.
readLine()도 참조하십시오 .
[since 6.9] bool QIODevice::readLineInto(QByteArray *line, qint64 maxSize = 0)
장치에서 한 줄을 읽되, 최대 maxSize 자까지 읽으며, 이를 line 에 바이트 배열로 저장합니다.
참고: line 가 nullptr 인 경우에도 이 장치에서 한 줄을읽습니다 .
maxSize 가 0이거나 지정되지 않은 경우, 줄의 길이는 제한되지 않으므로 무제한으로 읽을 수 있습니다.
결과 줄의 끝에 줄 끝 문자("\n" 또는 "\r\n ")가 포함될 수 있으므로, QByteArray::trimmed()를 호출해야 할 수도 있습니다.
읽을 수 있는 데이터가 없거나 오류가 발생한 경우, 이 함수는 ` false `를 반환하고 ` line `를 ` empty`로 설정합니다. 그렇지 않은 경우 ` true`를 반환합니다.
호출 전 ` line `의 내용은 어떤 경우에도 버려지지만, ` capacity()`의 값은 절대 감소하지 않는다는 점에 유의하십시오.
이 함수는 Qt 6.9에서 도입되었습니다.
readAll(), readLine() 및 QTextStream::readLineInto()도 참조하십시오 .
[signal] void QIODevice::readyRead()
이 신호는 장치의 현재 읽기 채널에서 읽을 수 있는 새로운 데이터가 생길 때마다 한 번씩 발생합니다. 이 신호는 네트워크 소켓에 새로운 네트워크 데이터 페이로드가 도착했거나, 장치에 새로운 데이터 블록이 추가되는 등 새로운 데이터가 생길 때만 다시 발생합니다.
readyRead() 신호는 재귀적으로 발신되지 않습니다. readyRead() 신호에 연결된 슬롯 내에서 이벤트 루프에 재진입하거나 waitForReadyRead()를 호출하더라도, 이 신호는 재발신되지 않습니다(단, waitForReadyRead()는 여전히 true를 반환할 수 있습니다).
QIODevice 에서 파생된 클래스를 구현하는 개발자를 위한 참고 사항: 새로운 데이터가 도착했을 때는 항상 readyRead()를 방출해야 합니다(버퍼에 아직 읽어야 할 데이터가 남아 있다는 이유만으로 방출해서는 안 됩니다). 그 외의 상황에서는 readyRead()를 방출하지 마십시오.
bytesWritten()도 참조하십시오 .
[virtual] bool QIODevice::reset()
랜덤 액세스 장치의 입력 시작 지점을 찾습니다. 성공하면 true를 반환하고, 그렇지 않은 경우(예: 장치가 열려 있지 않은 경우) false 를 반환합니다.
QFile QFile 에서 를 사용할 때, 에 reset()을 호출하면 가 파일을 버퍼링하기 때문에 예상한 결과를 얻지 못합니다. 대신 () 함수를 사용하십시오. QTextStream QTextStream QTextStream::seek
seek()도 참조하십시오 .
void QIODevice::rollbackTransaction()
읽기 트랜잭션을 롤백합니다.
입력 스트림을 startTransaction() 호출 시점으로 복원합니다. 이 함수는 트랜잭션을 커밋하기 전에 불완전한 읽기가 감지되었을 때 트랜잭션을 롤백하는 데 일반적으로 사용됩니다.
startTransaction() 및 commitTransaction()도 참조하십시오 .
[virtual] bool QIODevice::seek(qint64 pos)
임의 접근(RANDOM ACCESS) 장치의 경우, 이 함수는 현재 위치를 ` pos`로 설정하며, 성공 시 `true`를, 오류가 발생하면 `false`를 반환합니다. 순차(SEQUENTIAL) 장치의 경우, 기본적으로 경고 메시지를 출력하고 `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 가 true인 경우, 이 함수는 장치에 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이 아닌 경우 해당 위치를 1 뺍니다. 이 함수는 일반적으로 백트래킹 파서를 작성할 때와 같이 ` 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을 반환합니다.
read() 및 writeData()도 참조하십시오 .
qint64 QIODevice::write(const QByteArray &data)
data 의 내용을 장치에 기록합니다. 실제로 기록된 바이트 수를 반환하며, 오류가 발생한 경우 -1을 반환합니다.
이 함수는 오버로드된 함수입니다.
read() 및 writeData()도 참조하십시오 .
qint64 QIODevice::write(const char *data)
8비트 문자로 구성된 0으로 종료되는 문자열의 데이터를 장치에 기록합니다. 실제로 기록된 바이트 수를 반환하며, 오류가 발생한 경우 -1을 반환합니다. 이는 다음 코드와 동일합니다.
...
QIODevice::write(data, qstrlen(data));
...이 함수는 오버로드된 함수입니다.
read() 및 writeData()도 참조하십시오 .
int QIODevice::writeChannelCount() const
장치가 열려 있는 경우 사용 가능한 쓰기 채널의 개수를 반환하고, 그렇지 않은 경우 0을 반환합니다.
readChannelCount()도 참조하십시오 .
[pure virtual protected] qint64 QIODevice::writeData(const char *data, qint64 maxSize)
data 에서 최대 maxSize 바이트를 장치에 기록합니다. 기록된 바이트 수를 반환하며, 오류가 발생한 경우 -1을 반환합니다.
이 함수는 QIODevice 에 의해 호출됩니다. QIODevice 의 서브클래스를 생성할 때 이 함수를 재구현하십시오.
이 함수를 재구현할 때는 반환하기 전에 사용 가능한 모든 데이터를 반드시 기록해야 합니다. 이는 QDataStream 가 해당 클래스에 대해 작업을 수행할 수 있도록 하기 위해 필요합니다. QDataStream 는 모든 정보가 기록되었다고 가정하므로, 문제가 발생하더라도 쓰기 작업을 재시도하지 않습니다.
© 2026 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.