2010-12-05 5 views
1

J'ai un code simple utilisant QTextStream et il fonctionne très bien dans Visual Studio en mode débogage, mais si je le mets en mode release, il ne le fait pas en utilisant Qt4.6.3 vs2008, ce qui pourrait être le problème si cela fonctionne en mode débogage? insérer le code ci-dessous:QTextStream et le mode de sortie de 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; 
    } 

Répondre

2

C'est parce que vous mettez le code avec des effets secondaires dans un assert:

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

Ce code est jamais exécuté en mode de libération. Non seulement les assertions sont désactivées, mais le code qui s'y trouve n'est pas exécuté! Règle: Ne mettez jamais rien avec des effets secondaires à l'intérieur d'un assert(). C'est la première chose à rechercher quand quelque chose fonctionne en mode debug mais pas en mode release.

Si vous voulez affirmer, faire comme ceci:

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

Tout le monde le fait au moins une fois. Les assertions sont utiles, mais un peu mal aussi. – Thomi

+0

Oui, ne jamais affirmer() sur des conditions en dehors du contrôle de l'application - comme l'état du système de fichiers, les données d'entrée, les actions de l'utilisateur, etc. Mais ce problème peut également se produire avec assert(). –

+0

Merci pour votre aide! Cela a résolu mon problème, je ne savais pas que l'affirmation est ignorée en mode de libération. – Corgan

Questions connexes