2012-01-23 18 views
3

これはとても愚かです。私は文字通り1時間空白文字で区切られた数字の.txtファイルを読み込もうとしています。 whileループは何らかの理由で一度だけ実行されます!C++ .txtファイルからスタックへの整数の読み込み

#include <iostream> 
#include <string> 
#include <fstream> 
#include <stack> 

using namespace std; 

int main(int argc, char* argv[]) 
{ 
    string line; 
    string str(argv[1]); 
    ifstream myfile((str).c_str()); 
    int num; 
    stack<int> x; 

    while (myfile >> num); 
    { 
     x.push(num); 
    } 

    return(0); 
} 

答えて

7

うーん、より密接にこの行を見て:

while (myfile >> num); 

最終的には、セミコロンに気付くでしょう。コンパイラは、何もしないループが必要であることを意味していると考えます(セミコロンは空の単一のステートメントを示します)。したがって、ループはすべての数値を読み込みますが、何もしません。

次のセクションは、ループの後に実行されるように、(括弧で示す)、それ自身の範囲内のステートメントとして別々に解釈される:スタックに読み取る最後の番号をプッシュされないこと

{ 
    x.push(num); 
} 

すべてループが1回だけ実行されると考えるように導く。

;を削除しても問題ありません。一度、あなたは無関係なノートで;-)

決して忘れません。このことにより、かま、それは、argv[1](Cスタイルの文字列)を取るstringオブジェクトに入れて、そのをオンにするc_str()を使用するように少し愚かですifstreamコンストラクタのC文字列に戻します。他に何もしていないので、argv[1]を直接使用してください。また、argcを最初にチェックし、ファイル名が渡されていることを確認することをお勧めします。最後に、ファイルが正常に開かれたことを確認する必要があります。少なくとも、仮定してください。assert(myfile.is_open()); 。ああ、あなたはline変数をまったく使用しません。

+2

おそらくあなたは、なぜコンパイルの警告をすべて有効にすると主張しているのか分かります。 –

+0

@Cyber​​Shot:問題ありません;-)残りのコードをニックピッキングした段落を追加しました。 。 – Cameron

+0

@KerrekSB私は-Wallフラグを使用して警告を受け取りませんでした。 – CyberShot

関連する問題