Overwrite text file vs append

I'm looking to overwrite data in a text file but all I can seem to do is append to it

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();

Answers


Change

mFile.open(QFile::ReadWrite);

to

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

The QIODevice vs QFile distinction isn't necessary, but I personally favor using the base class. The Truncate flag will overwrite (i.e., delete) an existing file.

Alternatively, you can follow the other suggestion and open your text file directly using one of QTextStream's constructors. The same QIODevice::OpenMode conventions apply. This only works if mFile is a FILE object and not a QFile, which isn't the case in your example.


A couple additional notes for beginners.

Related Note 1

You didn't ask about this, but I also added the QIODevice::Text flag to ensure that newline characters get translated to/from the local encoding (plain \n vs. \r\n) when you use endl.

Related Note 2

Using QTextStream::endl will automatically call flush() each time. If your loop is large, use "\n" instead to prevent a slowdown unless you actually need to flush every line.

QFile::close() also calls flush(), which makes your mFile.flush() at the end redundant.


Use an overloaded constructor of QTextStream:

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

The QIODevice::Truncate will remove all the previous content of the file, and QIODevice::ReadWrite will open it for read and write access.


Need Your Help

Adding Fling Gesture to an image view - Android

android imageview gestures onfling

Okay I have been referencing the code here: Fling gesture detection on grid layout