2015-10-16 126 views
-2

我有一個簡單的程序。它需要stdin並輸出用戶剛剛輸入的內容。還有就是我用具有幾個問題是代碼:寫入文件時出錯

  1. 出於某種原因,在我輸入的中間,它停止服用輸入和退出程序。 [輸入爲黑體,下面的輸出不是]

    [---] ./ a.out的

    哈珀

    哈珀

    奧巴馬

    奧巴馬

    唐納德·特朗普

    唐納德·特朗普

    本·卡森

  2. 如果我把上面成一個名爲FILE1.TXT和寫入

    ./a.out < file1.txt 
    

,它會起作用,但如果我把上面的輸入放到一個帶有「.in」擴展名的文件中並且做同樣的事情,它就不會。

  1. 如果我在輸入中更改naems,它會改變接受的輸入行數。

如果有人告訴我發生了什麼,我會很感激。

感謝

我的代碼是:

#include <iostream> 
    #include <fstream> 
    #include <sstream> 
    #include <string> 

    using namespace std; 

    int main() { 
     bool empt = false; 
     int num_ppl = 0; 
     int num_spoilt = 0; 
     ofstream names2 ("names2.txt"); 

     if (names2.is_open()) { 
      int a = 0; 
      while(1) { 
      string line; 
      getline(cin, line); 
      if (line.length() == 0) { 
       empt = true; 
       break; 
      } 
      if (((line[a] >= 'A') && (line[a] <= 'Z')) || 
       ((line[a] >= 'a') && (line[a] <= 'z'))) { 
       cout << line << endl; 
       names2 << line; 
       names2 << endl; 
       num_ppl++; 
      } else { 
       break; 
      } 
      a++;  
     } 
     names2.close(); 
    } 
} 
+0

順便說一句,你可以很容易地發現的問題,如果你只知道如何使用調試器。如果在調試器中一行一行地逐行瀏覽代碼,同時觀察變量和它們的值,則很容易很快發現問題。 –

回答

0

這是你擁有這封信確實是一個失敗的信件檢查。

讓我們把它從開始:

  1. 對於輸入Stephen Harper你檢查line[0]是一個字母,它是。
  2. 對於輸入Barack Obama,你檢查line[1]是一封信,它是。
  3. 對於輸入Donald Trump您檢查line[2]是一封信,它是。
  4. 對於輸入Ben Carson你檢查line[3]是一個字母,這是,所以你跳出循環。

如果你想確保所有的輸入是字母(或空格),你需要在一個單獨的循環中做到這一點。或使用standard algorithm functionstd::all_of

if (std::all_of(std::begin(line), std::end(line), 
    [](const char& ch) { 
     return std::isalpha(ch) || std::isspace(ch); 
    })) 
{ 
    ... 
} 
else 
    break; 
+0

好的。謝謝你。我不相信我沒有看到。但我仍然不確定我在帖子中提到的第二個問題。爲什麼會發生? –