2012-11-09 13 views
5

Sto cercando di sovrascrivere i dati in un file di testo, ma tutto quello che riesco a fare è accodare ad essofile di testo sovrascrittura vs accodamento

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

risposta

18

Change

mFile.open(QFile::ReadWrite); 

a

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

La distinzione QIODevice vs qfile non è necessario, ma io personalmente favore utilizzando la classe di base. Il flag Truncate sovrascriverà (cioè elimina) un file esistente. Non l'hai chiesto, ma devi aggiungere il flag QIODevice::Text per assicurarti che i caratteri di nuova riga vengano tradotti nella/dalla codifica locale (semplice \n rispetto a \r\n).

In alternativa, è possibile seguire lo other suggestion e aprire direttamente il file di testo utilizzando uno dei costruttori di QTextStream. Si applicano le stesse convenzioni QIODevice::OpenMode.

7

Utilizzare un costruttore di sovraccarico di QTextStream:

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

Il QIODevice::Truncate rimuoverà tutto il contenuto precedente del file e QIODevice::ReadWrite lo aprirà per l'accesso in lettura e scrittura.