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 は、ランダムアクセスデバイスとシーケンシャルデバイスの 2 種類のデバイスを区別します。
- ランダムアクセスデバイスは、seek() を使用して任意の位置へのシークをサポートしています。ファイル内の現在の位置は、pos() を呼び出すことで取得できます。QFile およびQBuffer は、ランダムアクセスデバイスの例です。
- シーケンシャルデバイスは、任意の位置へのシークをサポートしていません。データは1回のパスで読み込む必要があります。関数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() - この関数は、1つのデータペイロードがデバイスに書き込まれるまで、呼び出し元のスレッドでの処理を一時停止します。
- 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操作はバッファとの相性が良くありません。例えば、複数のユーザーが同じデバイスを開き、1文字ずつ読み込む場合、それぞれが別々のデータブロックを読み取るつもりだったにもかかわらず、結果として同じデータを読み取ってしまう可能性があります。 このため、QIODevice では、open() に Unbuffered フラグを渡すことで、バッファリングを無効にすることができます。QIODevice をサブクラス化する際は、デバイスが Unbuffered モードで開かれている場合、使用するバッファをすべて無効にすることを忘れないでください。
通常、非同期デバイスからの受信データストリームは断片化されており、データのチャンクは任意のタイミングで到着する可能性があります。データ構造の不完全な読み取りを処理するには、QIODeviceによって実装されているトランザクションメカニズムを使用してください。詳細については、startTransaction() および関連関数を参照してください。
一部のシーケンシャルデバイスは、複数のチャネルを介した通信をサポートしています。これらのチャネルは、独立してシーケンス化された配信という特性を持つ、個別のデータストリームを表します。デバイスがオープンされると、readChannelCount() およびwriteChannelCount() 関数を呼び出すことで、チャネルの数を特定できます。チャネルを切り替えるには、それぞれsetCurrentReadChannel() およびsetCurrentWriteChannel() を呼び出します。 また、QIODevice は、チャネルごとに非同期通信を処理するための追加のシグナルも提供します。
セキュリティに関する考慮事項
QIODevice には、バウンドなしの読み取りを可能にする一連のメソッドがあります。本稿の執筆時点では、これらのメソッドにはreadAll() 、readLine(0) 、およびreadLineInto(buffer, 0) が含まれます。後者の 2 つは、値0 に対して特別な意味を持ち、これを無制限として扱います。
シーケンシャルデバイス、あるいはsize()の戻り値がゼロとなるデバイス(例:/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
デバイスから完全な1行分のデータを読み込める場合は `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)
デバイスから1文字を読み取り、それを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
デバイスがどのモードで開かれているかを返します。つまり、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 バイトが読み込まれた。
- デバイスのデータの末尾が検出された。
たとえば、次のコードはファイルから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() 関数を呼び出すことで、完全な行(改行文字を含む)を読み取れるかどうかを確認できます。
この関数は、getChar() を繰り返し呼び出すことで実装されているreadLineData() を呼び出します。独自のサブクラスでreadLineData() を再実装することで、より効率的な実装を実現できます。
getChar()、read()、canReadLine()、およびwrite()も参照してください 。
QByteArray QIODevice::readLine(qint64 maxSize = 0)
デバイスから1行を読み込みますが、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)
このデバイスから1行を読み取り、buffer に格納し、読み取ったデータを含むbuffer の部分集合を返します。
buffer のサイズが行の長さよりも小さい場合、buffer に収まる文字のみが読み込まれ、返されます。 この場合、readLineInto()を再度呼び出すことで、行の残りの部分が取得されます。行全体が読み込まれたかどうかを判断するには、まず、最後の行が改行で終わっていない場合に備えて、デバイスがatEnd()であるかどうかを確認します。そうでない場合は、atEnd()を呼び出し、返されたビューが「\n 」で終わっているかどうかを確認します。そうでない場合は、readLineInto()を再度呼び出す必要があります。
結果として得られる行には、末尾に行末文字(「\n 」または「\r\n 」)が含まれている可能性があるため、QByteArrayView::trimmed()を呼び出す必要がある場合があります。
エラーが発生した場合、この関数は nullQByteArrayView を返します。それ以外の場合は、buffer のサブスパンとなります。現在読み取り可能なデータがない場合、またはデバイスがatEnd() の場合、この関数は空のQByteArrayView を返します。
戻り値はヌル終端されていないことに注意してください。ヌル終端が必要な場合は、buffer.chopped(1) を渡し、buffer[result.size()] の位置に '\0' を挿入することができます。
これらの関数は Qt 6.9 で導入されました。
readLine()も参照してください 。
[since 6.9] bool QIODevice::readLineInto(QByteArray *line, qint64 maxSize = 0)
デバイスから1行を読み込みますが、maxSize 文字を超えない範囲で読み込み、line にバイト配列として格納します。
注: line がnullptr であっても、このデバイスから1行を読み取ります 。
maxSize が 0 または指定されていない場合、行の長さは任意となり、無制限の読み取りが可能になります。
結果の行の末尾には、行末文字(「\n 」または「\r\n 」)が含まれる場合があるため、QByteArray::trimmed() を呼び出す必要がある場合があります。
読み取り可能なデータが現在存在しない場合、またはエラーが発生した場合は、この関数は `false ` を返し、`line ` を `empty` に設定します。それ以外の場合は `true` を返します。
なお、呼び出し前のline の内容はいずれの場合も破棄されますが、そのcapacity()の値が減少することは決してありません。
この関数は Qt 6.9 で導入されました。
readAll()、readLine()、およびQTextStream::readLineInto()も参照してください 。
[signal] void QIODevice::readyRead()
このシグナルは、デバイスの現在の読み取りチャネルから読み取り可能な新しいデータが利用可能になるたびに 1 回発火します。ネットワークソケットに新しいネットワークデータのペイロードが到着した場合や、デバイスに新しいデータブロックが追加された場合など、新しいデータが利用可能になって初めて、再び発火します。
readyRead()は再帰的に発火することはありません。readyRead()シグナルに接続されたスロット内でイベントループに再進入したり、waitForReadyRead()を呼び出したりしても、シグナルは再発火しません(ただし、waitForReadyRead()は依然としてtrueを返す可能性があります)。
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 に設定し、成功した場合はtrueを、エラーが発生した場合はfalseを返します。シーケンシャルデバイスに対して、デフォルトの動作は警告を出力して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() の動作と同様に 1 バイトとしてカウントされます。
この関数は、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ビット文字のヌル終端文字列からデバイスへデータを書き込みます。実際に書き込まれたバイト数を返します。エラーが発生した場合は-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.