Overwrite text file vs append
qfile, qt
Solution
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`.
A really common mistake is to use `\r\n` AND `QIODevice::Text`, which results in text files with double-returns `\r\r\n` on Windows. Just use `QIODevice::Text` when opening and simply `\n` or `endl` and you'll never have this problem.
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. The stream will automatically write to disk as its buffer gets full, or when it's closed.
QFile::close() also calls `flush()`, which makes your `mFile.flush()` at the end redundant.
Problem
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(); ```