Qtテキスト読み書きの1つ:入出力装置とファイル操作


一、入出力装置
QIODeviceクラスは、Qt内のすべてのI/Oデバイスのベースインタフェースクラスであり、QFile、QBuffer、QTcpSocketなどのデータブロックの読み取り/書き込みをサポートするデバイスに抽象的なインタフェースを提供する.QIODeviceクラスは抽象的で、インスタンス化できません.一般的には、定義されたインタフェースを使用してデバイスに関係のないI/O機能を提供します.
QIODeviceクラスの継承関係図
QIODeviceでは、ランダムアクセスデバイスとシーケンスストレージデバイスの2種類のデバイスが区別されます.(プログラムでisSequentiaUを使用することができます)関数を使用してデバイスのタイプを判断します.)
  • ランダムアクセスデバイスは、seek()関数を使用して任意の位置に位置決めすることをサポートする.ファイル内の現在の位置はpos()関数を使用して取得できます.このようなデバイスにはQFile、QBufferなどがあります.
  • シーケンス記憶装置は、任意の位置への位置決めをサポートせず、データを一度に読み出す必要がある.Pos()やsize()などの関数はシーケンスデバイスの操作時には使用できません.このような装置にはQTcpSocket,QUdpSocket,Qprocessなどがある.

  • ファイルオープンモード
    デバイスにアクセスする前にopen()関数を使用してデバイスを開く必要があり、正しいオープンモードを指定する必要があります.QIODeviceのすべてのオープンモードはQIODevice::OPenMode列挙変数によって定義され、その値は以下の表に列挙され、そのうちのいくつかの値はビット単位または記号「丨」を使用して同時に使用することができる.デバイスを開くとwrite()またはputChar()を使用してライターを作成し、read()、readLine()またはreadAll()を使用して読み取り、最後にclose()を使用してデバイスを閉じることができます.
    列挙値
    説明
    QIODevice::NotOpen
    開いていません
    QIODevice::ReadOnly
    読み取り専用で開く
    QIODevice::WriteOnly
    書き込み専用で開く
    QIODevice::ReadWrite
    読み書きで開く
    QIODevice::Append
    追加で開き、新しく追加された内容がファイルの末尾に追加されます
    QIODevice::Truncate
    書き換えで開き、新しいデータを書き込むときにカーソルをファイルの先頭に設定します.
    QIODevice::Text
    読み取り時に、行の終端を変換します.書き込み時には、Win 32プラットフォーム上でr
    QIODevice::Unbuffered
    キャッシュを無視
    二、ファイルQFile
    QFileクラスは、テキストファイル、バイナリファイル、Qtリソースの読み取り/書き込みに使用できるI/Oデバイスであるファイルの読み取り/書き込みインタフェースを提供します.QFileは単独で使用してもよいし、QTextStreamやQdataStream-と一緒に使用してもよいので、より便利です.
    QFileオブジェクトを構築するときにファイル名を指定するのが一般的ですが、setFileName()を使用して他の時間に設定することもできます.exists()を使用してファイルが存在するかどうかをチェックし、remove()を使用してファイルを削除できます.ファイルシステムに関連するより高度な操作は、QFilelnfoクラスおよびQDIRクラスで提供されます.
    ファイルはopen()で開き、close()で閉じ、flush()でリフレッシュできます.ファイルのデータ読み書きは、一般的にQTextStreamまたはQdataStreamを使用して行われますが、read()、readLine()、readAll()およびwrite()などのQIODeviceクラスから継承された関数や、1文字のみを操作するgetChar()、putChar()およびungetChar()などの関数も使用できます.size()関数を使用してファイルのサイズを取得し、seek()を使用してファイルの任意の位置にナビゲートし、pos()を使用して現在の位置を取得し、atEnd()を使用してファイルの末尾に到達したかどうかを判断できます.
    (1)QFileを直接使用してファイルを読み書きする
    サンプル・プログラムは次のとおりです.
    //    QFile   
    QFile fileW("test.txt");
    if (!fileW.open(QIODevice::WriteOnly | QIODevice::Text))
        return;
    fileW.write("first line!
    second line"); fileW.close(); // QFile QFile fileR("test.txt"); if (!fileR.open(QIODevice::ReadOnly | QIODevice::Text)) return; while (!fileR.atEnd()) { QByteArray line = fileR.readLine(); qDebug() <

    (2)テキストストリームを使用したテキストファイルの読み取り/書き込み
    QTextStreamクラスは、QIODevice、QByteArray、QStringで操作できる便利なインタフェースを提供します.QTextStreamのフローオペレータを使用すると、単語、行、数字を簡単に読み書きできます.サンプル・プログラムは次のとおりです.
    //  QTextStream      
    QFile fileW("test.txt");
    if (!fileW.open(QIODevice::WriteOnly | QIODevice::Text))
        return -1;
    QTextStream out(&fileW);
    out << "first line" << "
    second line"; fileW.close(); // QTextStream QFile fileR("test.txt"); if (!fileR.open(QIODevice::ReadOnly | QIODevice::Text)) return -1; QTextStream in(&fileR); while (!in.atEnd()) { QString line = in.readLine(); qDebug() <

    seek()を使用して指定された位置にナビゲートし、atEnd()を使用して読み取り可能なデータがあるかどうかを判断できます.flush()関数が呼び出された場合、QText­Streamは、書き込みバッファ内のすべてのデータを空にし、デバイスのflush()関数を呼び出します.
    内部では、QTextStreamはUnicodeベースのバッファを使用し、QTextStreamはQTextCodecを使用して異なる文字セットを自動的にサポートします.デフォルトでは、QTextCodec::codecForLocale()で返されるエンコーディングを使用して読み書きを行うか、setCodec()関数を使用してエンコーディングを設定します.
    (3)データストリームを用いたバイナリデータの読み書き
    QdataStreamクラスはQIODeviceのバイナリデータのシリアル化を実現した.1つのデータストリームは、ホストのオペレーティングシステム、CPU、バイト順序とは完全に独立したバイナリ符号化情報ストリームである.データストリームは、符号化されていない元のバイナリデータを読み書きすることもできる.QdataStreamクラスは、char、Sh〇rt、im、char*などのC++基本データ型のシリアル化を実現することができる.シリアル化がより複雑なデータは、データを基本的なデータ型に分解することによって達成される.サンプル・プログラムは次のとおりです.
    //  QTextStream      
    QFile fileW("test.txt");
    if (!fileW.open(QIODevice::WriteOnly))
        return -1;
    QDataStream out(&fileW);
    //      (   ,       QString  ,        )
    out << QString("the answer is");
    //     
    out << static_cast(42);
    fileW.close();
    
    //  QTextStream      
    QFile fileR("test.txt");
    if (!fileR.open(QIODevice::ReadOnly))
        return -1;
    QDataStream in(&fileR);
    QString str;
    qint32 num;
    in >> str >> num;
    qDebug() << str << num; //  :"the answer is" 42
    fileR.close();

    データ・ストリームに書き込まれる各エントリは、エントリのタイプに依存する事前定義されたフォーマットで書き込まれます.(そうでない場合は文字化けして書き込まれる)サポートされるQtタイプには、QBrush、QColor、QdatTime、QFom、Qpixmap、QString、QVariant、その他の多くのフォーマットが含まれます.
    三、ファイル情報QFilelnfo
    QFilelnfoクラスは、ファイル名、ファイルシステム内の場所(パス)、ファイルへのアクセス権、ディレクトリまたはシンボルリンクであるかどうかなど.QFilelnfoは、ファイルのサイズや最近の変更/読み込みの時間を取得したり、Qtリソースに関する情報を取得したりすることもできます.QFilelnfoが指すファイルは、QFileinfoオブジェクト構築時に設定したり、後でsetFile()を使用して設定したりすることができます.
  • QFileInfoは、相対パスまたは絶対パスを使用してファイルを指すことができ、makeAbsolute()を使用して相対パスを絶対パスに変換することもできます.
  • ファイルのタイプは、isFile()、isDir()およびisSymLink()を使用して取得できます.path()とfileName()をそれぞれ使用してファイルのパスとファイル名を取得したり、baseName()を使用してファイル名の基本名を取得したり、suffix()を使用してファイル名の接尾辞を取得したり、completeSuffix()を使用して複合接尾辞を取得したりすることができます.
  • ファイルの日付は、created()、lastModified()、lastRead()を使用して返すことができます.
  • アクセス権は、isReadable()、isWritable()およびisExecutable()を使用して取得できます.
  • ファイルの所有権は、owner()、ownerId()、group()およびgroupId()を使用して取得できます.

  • 新しいQt 5コンソールアプリケーション、名前はmyFile、作成が完了するとmain.cppファイルの内容は次のように変更されました.
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        //        ,       ,        
        QFile file("myfile.txt");
        if (!file.open(QIODevice::WriteOnly  | QIODevice::Text))
            qDebug() << file.errorString();
        file.write("helloQt!
    yafeilinux"); file.close(); // QFileInfo info(file); qDebug() << QObject::tr(" :") << info.absoluteFilePath() << endl << QObject::tr(" :") << info.fileName() << endl << QObject::tr(" :") << info.baseName() << endl << QObject::tr(" :") << info.suffix() << endl << QObject::tr(" :") << info.created() << endl << QObject::tr(" :") << info.size(); // if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) qDebug() << file.errorString(); qDebug() << QObject::tr(" :") << endl << file.readAll(); qDebug() << QObject::tr(" :") << file.pos(); // 0 file.seek(0); QByteArray array; array = file.read(5); qDebug() << QObject::tr(" 5 :") << array << QObject::tr(" :") << file.pos(); // 15 file.seek(15); array = file.read(5); qDebug() << QObject::tr(" 16-20 :") << array; file.close(); return a.exec(); }

    実行プログラム、コンソール出力は次のとおりです.
    "    :" "D:/Project/C++/Qt/myFile/build-myFile-Desktop_Qt_5_9_7_MinGW_32bit-Debug/myfile.txt"
    "   :" "myfile.txt"
    "    :" "myfile"
    "  :" "txt"
    "    :" QDateTime(2019-06-17 16:58:01.230        Qt::TimeSpec(LocalTime))
    "  :" 20
    "    :"
    "helloQt!
    yafeilinux" " :" 20 " 5 :" "hello" " :" 5 " 16-20 :" "linux"

    四、臨時ファイルQTemporaryFile
    QTemporaryFileクラスは、一時ファイルを操作するためのI/Oデバイスであり、一意の一時ファイルを安全に作成できます.Open()関数を呼び出すと一時ファイルが作成され、一時ファイルのファイル名が一意であることが保証され、QTemporaryFileオブジェクトが破棄されると自動的に削除されます.
    Open()関数を呼び出すと、デフォルトではQIODevice::ReadWriteモードが使用され、次のコードのようにQTemporaryFileクラスを使用できます.
    QTemporaryFile file;
    if (file.open()) 
    {
        //             ,file.fileName()          
    }

    close()関数を呼び出した後にQTemporaryFileを再開くのは安全です.QTemporaryFileのオブジェクトが破棄されない限り、唯一の一時ファイルは常に存在し、QTemporaryFile内部で開いています.一時ファイルはデフォルトでシステムの一時ディレクトリに生成されます.このディレクトリのパスはQDIR::tempPath()を使用して取得できます.
    転載先:https://www.cnblogs.com/linuxAndMcu/p/11040201.html