2016-12-20 17 views
0

このコードで何が問題になっていますか? (Qt環境でQtextStreamを使用したかったが、 文字列が空である。コードが正常に動作する.BTW:ベクターや文字列のように直接使用されるテンプレートをQtがサポートしていないという特別な理由はありますか?標準ストリームでQTextStreamは空の文字列を提供します

QString MyFileName; 
    QTextStream ts; 
    ts << DirName.c_str() 
     << QDate::currentDate().toString("_yyyy_MM_dd.log").toStdString().c_str() 
     << " (" << ++VolumeNumber << ")"; 
    ts >> MyFileName; 
    string FileName= MyFileName.toStdString(); 

それははるかに簡単です:

ostringstream oss; 
    oss << DirName.c_str() << QDate::currentDate().toString("_yyyy_MM_dd.log").toStdString().c_str() << " (" << ++VolumeNumber << ")"; 
    FileName= oss.str(); 

Qtのアプローチの利点は何ですか?

+0

あなたの質問に関しては、 'QTextStream'はあなたが望むもののための適切なツールではありません。これはテキストのシリアライズ(通常はファイル)ですが、あなたが望むものは 'QString'を使ってライナーとして簡単に達成できます。 – Resurrection

+0

'toStdString()。c_str()'は 'QTextStream'の文脈では意味を持ちません。 'QDate :: currentDate()。toString(....)'の結果である 'QString'を直接パイプすることができます。 – E4z9

答えて

0

QTextStreamにデバイスを割り当てていないためです。それはQIODeviceで動作します(QStringも使用できますが、内部ではQTextStreamからQBufferまでプロキシされます)ので、何もしません。あなたは実行する必要があります。

QString buffer; 
QTextStream ts(&buffer); 

あなたは、デバイスがそれは別のエラーであるので、それはあなたの空の文字列を与えるからそう読んで終わりに設定されているデータを入力した後。そこから読み取るには、デバイスをリセットする必要があります。

これは、元のデバイスを最初に移動します。ランダムアクセスデバイスの場合は、特定の場所にseekを置いてそこから開始できます。

デシリアライズしようとしているもの以外のものをシリアル化しているので、あなたが望むのはうまくいきません(上記のすべての問題は耐えられません)。最初にシリアライズする文字列を作成し、QTextStreamでシリアル化してもう一度デシリアライズする必要があります。

関連する問題