PDA

Показать полную графическую версию : cin и cout корректно ли работают в MSVC 6.0?


Crew
22-06-2003, 21:59
Никогда не любил ни cin ни cout
Но вот себе пример копирую с сопровождающего диска (авторы компилировали точно не на MSVC)
Вот пример:

* *string * * * *strID;
* *string * * * *strName;
* *int * * * * * intPrice;

* *cout << "Add Products:\n";
* *while(1)
* *{
* * * *cout << "ID (Type 0 to finish): ";
* * * *getline(cin, strID);
* * * *if (strID == "0") * *break;

* * * *cout << "Name * * * * * * * * : ";
* * * *getline(cin, strName);
* * * *cout << "Price * * * * * * * *: ";
* * * *cin *>> intPrice;
* * * *cin.ignore();

* * * *mProducts[strID] = new Product(strID, strName, intPrice);
* * * *cout << "Product added to the list\n\n";
* *}
[br]
Несмотря на внешнюю прозрачность происходит следующее:
вместо того, чтобы завершить ввод по первому getline (после Enter) мне выдается еще одна строка, вроде как относящаяся к тому же getline. Если смотреть по trace то эта вторая строка не запоминается.
Приблизительно повторяется то же, что и в первом случае со вторым getline.
Ввести price не удается, он срывается с места и считает что я везде ввел по нулям и зацикоивается в этом while(1)
простенькие cin и cout срабатывали у меня раньше...

здесь http://forum.oszone.net/topic.cgi?forum=18&topic=222&start=0#0
прочитал

Вероятнее всего причина в том, что в проверяющей системе стоит компилятор MSVC 6.0 и там замечено много глюков с STL

Бороться с этим можно, может знает кто? Патч специальный например какой-нибудь....
А то я задумал активно использовать STL в своей программе, а тут даже рабочий пример "нерабочий". Обидно :(

shurikan
24-06-2003, 17:32
Crew
Это getline виновата. Она всегда в буфере оставляет CR/LF. Нужно буфер чистить.

Crew
26-06-2003, 22:09
shurikan
Не могу вспомнить замену cin.ignore(), но она ведь должна извлекать и уничтожать данные из потока.
Если не сложно, как можно переписать ввод нескольких слов из потока?
т.е. я не смог изобразить у себя ввод с клавиатуры нескольких слов, чтоб они в одну переменную заносились (раньше книга была, где это описывалось, но кто-то заиграл)

Vla2003
28-06-2003, 19:23
Вот этот код нормально работает на билдере 6 и наверняка то же будет и в других оболочках:



//---------------------------------------------------------------------------
#include <iostream.h>

#include <string>

//---------------------------------------------------------------------------
string strID;
string strName;
int intPrice;
int main()
{ cout <<"Add Products:\n";
while(1)
{cout<<"ID (Type 0 to finish): *";

getline(cin,strID);
if(strID=="0")break;
cin.ignore(0,'\n');

cout<<"\nName * * * * * * :";

getline(cin,strName);
cin.ignore(0,'\n');


while(1){ cout<<"\nPrice * * * * * * :";

cin.unsetf(ios::skipws);
*
cin>>intPrice;
if(cin.good()) {cin.ignore(1000,'\n');break;}
cin.clear(); cout<<"\nInvalid Price. Try again.";
cin.ignore(1000,'\n');
}
mProducts[strID]=new Product(strID,strName,intPrice);
*
cout<<"\nProduct added to the list\n\n";

}




* * * *return 0;
}
//---------------------------------------------------------------------------

Crew
28-06-2003, 21:07
ID (Type 0 to finish):  stID
k

Name             :just name

Price             :
Invalid Price. Try again.
Price             :

Результат работы вышепрведенного кода :
Vla2003
большое спасибо, но dиновата я думаю MSVC,
попробую этот код в другом компиляторе опробовать

Vla2003
29-06-2003, 08:59
Crew


Full Member Редактировать | Профиль | ICQ | Цитировать


ID (Type 0 to finish):  stID
k

Name             :just name

Price             :
Invalid Price. Try again.
Price             :

Результат работы вышепрведенного кода :
Vla2003

Попробуй убрать cin.unsetf(ios::skipws);    - это только, чтобы вместо цифр не нажимали ENTER

Crew
01-07-2003, 21:06
Vla2003
Price я вообще не ввожу, прошу прощения, что не пояснил. Где есть текст, там программа дает мне ввести код, где нет, он просто проскакивает. если б не блок корректности, то была бы та же зацикленность (а она и осталась) что и первый раз, только тут меня вежливо просят повторить




© OSzone.net 2001-2012