2010-12-05 96 views
1

我有一個使用QTextStream的簡單代碼,它在調試模式下在Visual Studio中工作得非常好,但是如果我把它放在發佈模式下,它不會使用Qt4.6.3 vs2008的t read anything from the file. I included QtCore4.lib for the release mode and for the debug mode QtCored4.lib. I m,問題,如果它在調試模式下工作? 我插入下面的代碼:QTextStream和Visual Studio 2008發佈模式

#include <iterator> 
#include <QFile> 
#include <QTextStream> 
#include <QString> 
#include<iostream> 
#include<fstream> 
#include<iterator> 
#include<assert.h> 
#include<stdio.h> 
using namespace std; 
void main() 
{ 

QString qsArgsFile = "curexp.txt",line; 
QByteArray baline; 
cout<<qsArgsFile.toAscii().data(); 
QFile qfile(qsArgsFile); 
    assert(qfile.open(QIODevice::ReadOnly | QIODevice::Text)); 
    QTextStream stream(&qfile); 
baline = qfile.read(50); 
const char *liner; 
    while(!(line = stream.readLine()).isNull()) 
     if (!line.isEmpty()) { 
    baline = line.toLatin1(); 
    liner = baline.data(); 
     cout << liner << endl; 
    } 

回答

2

那是因爲你把有副作用的代碼放到斷言:

assert(qfile.open(QIODevice::ReadOnly | QIODevice::Text)); 

這段代碼在釋放模式從不執行。斷言不僅被禁用,而且它們內部的代碼也不會被執行!規則:不要在assert()中放置任何帶有副作用的東西。當某些東西在調試模式下工作時,這是第一個要查找的東西,而不是在發佈模式下。

如果要斷言,像這樣做:

const bool opened = qfile.open(QIODevice::ReadOnly | QIODevice::Text); 
assert(opened); 
+1

每個人做這至少一次。斷言是有用的,但也有點邪惡。 – Thomi 2010-12-05 22:27:11