7

テキストファイルのデータを上書きしようとしていますが、できることは追加することだけです

mFile.open(QFile::ReadWrite)

QTextStream in(&mFile);
QString first = in.readLine(); //discard the headers
QString dataLine = in.readLine(); //headers
QStringList sql_row = dataLine.split("\t"); //first row (sake of proj only 1 row)

if(sql_row[1].isEmpty()) //no user name registered
{
    QByteArray user= getenv("USERNAME"); //for windows
    if(user.isEmpty())
        {
                user = getenv("USER"); ///for MAc or Linux
            }
    dataLine = dataLine.insert(dataLine.indexOf("\t")+ 1,user);

    in << first << endl << dataLine << endl;
    mFile.flush();
    mFile.close();
4

2 に答える 2

25

変化する

mFile.open(QFile::ReadWrite);

mFile.open(QIODevice::ReadWrite | QIODevice::Truncate | QIODevice::Text);

QIODevice と QFile の区別は必要ありませんが、個人的には基本クラスを使用することを好みます。このTruncateフラグは、既存のファイルを上書き (つまり、削除) します。

または、他の提案に従って、QTextStream のコンストラクターの 1 つを使用してテキスト ファイルを直接開くこともできます。同じQIODevice::OpenMode規則が適用されます。これは、 がオブジェクトであり、 ではない場合にのみ機能mFileFILEますQFileが、これはあなたの例では当てはまりません。


初心者向けのいくつかの追加メモ。

関連注記 1

あなたはこれについて尋ねませんでしたがQIODevice::Text、.\n\r\nendl

非常によくある間違いは、\r\nANDを使用することQIODevice::Textです。これにより、Windows でテキスト ファイルが二重に返さ\r\r\nれます。QIODevice::Text開封時に使用するだけで\nendlこの問題が発生することはありません。

関連注記 2

QTextStream::endlを使用するとflush()、毎回自動的に呼び出されます。ループが大きい場合は、"\n"実際にすべての行をフラッシュする必要がない限り、速度低下を防ぐために代わりに使用してください。ストリームは、バッファがいっぱいになるか、閉じられると、自動的にディスクに書き込みます。

QFile::close()は も呼び出しますflush()。これによりmFile.flush()、最後に冗長になります。

于 2012-11-10T00:13:23.370 に答える
10

QTextStream のオーバーロードされたコンストラクターを使用します。

QTextStream in(&mFile, QIODevice::ReadWrite | QIODevice::Truncate);

QIODevice::Truncate、ファイルの以前の内容をすべて削除し、QIODevice::ReadWrite読み取りおよび書き込みアクセス用にファイルを開きます。

于 2012-11-09T19:08:30.983 に答える