2016-06-13 12 views
9

noskipws hakkında bildiğim kadarıyla, beyaz boşlukların atlanmasını devre dışı bırakır. Yani, noskipws ile çalışmak istiyorlarsa, programlarında bazı char tarafından beyaz boşluklar alması gerekiyor. Ben Ctrl + (Windows için Ctrl + Z) D basarak cineof için koşul ayarlamak deneyin. Ancak, char veya string girdisini kullanırsam, akış, dosyanın sonuna tek bir girişle ayarlanır. Ancak, başka bir veri türü kullanırsam, bu kombinasyona iki kez basmamı gerektirir. noskipws isteğini kaldırırsam, her şey iyi çalışıyor. Aşağıdaki kod daha doğrusu sorunu açıklıyor:C++: noskipws bazı veri türleri için dosya algılamayı geciktiriyor

#include <iostream> 

using namespace std; 

int main() 
{ 
    cin >> noskipws; //noskipws request 
    int number; //If this int is replaced with char then it works fine 
    while (!cin.bad()) { 
     cout << "Enter ctrl + D (ctrl + Z for windows) to set cin stream to end of file " << endl; 
     cin >> number; 
     if (cin.eof()) { 
      break; // Reached end of file 
     } 
    } 
    cout << "End of file encountered" << endl; 

    return 0; 
} 

Neden cin bu şekilde davranıyor? Bu girdiyi int değişkenine koyamayacak olsa da, en azından isteği aldıkça bayrakları eof olarak ayarlamalıdır. Kullanıcı, Ctrl + Z basıldıktan sonra bile neden ikinci bir giriş yapar?

+1

Bu kodla beklenmedik davranışları oluşturmak için hangi girdiyi sağladığınızı açıkça söyleyebilir misiniz –

+0

Konsolda ctrl + Z tuşlarına basıyorum ve konsol bir daha fazla girdi gerektirir –

+0

Çapraz site kopyası: [Eşdeğer^D (bash) for cmd.exe?] (https://superuser.com/questions/291224/equivalent-to-d-in-bash-for-cmd-exe) –

cevap

0

noskipws kullanıldığında, kodunuz beyaz alanların çıkarılmasından sorumludur. Int okuduğunuzda beyaz boşluk ile karşılaşıldığı için başarısız olur.

an example bakınız:

#include <iostream> 
#include <iomanip> 
#include <cctype> 

#define NOSKIPWS 

#define InputStreamFlag(x) cout << setw(14) << "cin." #x "() = " << boolalpha << cin.x() << '\n' 

using namespace std; 

int main() 
{ 
#ifdef NOSKIPWS 
    cin >> noskipws; 
    char ch; 
#endif 
    int x; 
    while (cin >> x) { 
     cout << x << ' '; 
#ifdef NOSKIPWS 
     while (isspace(cin.peek())) 
     { 
      cin >> ch; 
     } 
#endif 
    } 
    cout << endl; 

    InputStreamFlag(eof); 
    InputStreamFlag(fail); 
    InputStreamFlag(bad); 
    InputStreamFlag(good) << endl; 

    return 0; 
} 

Ya visual studio.

İlgili konular