2010-12-05 27 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

+0

はい、決してアプリケーションの制御のようなファイルシステム状態、入力データ、ユーザーアクションなどの外の条件ではassert()しないでください。もちろん、この問題はassert()の完全に有効な使用法でも起こります。 –

+0

助けてくれてありがとう!これは私の問題を解決した、私はアサートがリリースモードでスキップされていることを知りませんでした。 – Corgan

関連する問題