Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   cin и cout корректно ли работают в MSVC 6.0? (http://forum.oszone.net/showthread.php?t=30426)

Crew 22-06-2003 21:59 208569

Никогда не любил ни 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";
 * *}

Несмотря на внешнюю прозрачность происходит следующее:
вместо того, чтобы завершить ввод по первому getline (после Enter) мне выдается еще одна строка, вроде как относящаяся к тому же getline. Если смотреть по trace то эта вторая строка не запоминается.
Приблизительно повторяется то же, что и в первом случае со вторым getline.
Ввести price не удается, он срывается с места и считает что я везде ввел по нулям и зацикоивается в этом while(1)
простенькие cin и cout срабатывали у меня раньше...

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

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

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

shurikan 24-06-2003 17:32 208570

Crew
Это getline виновата. Она всегда в буфере оставляет CR/LF. Нужно буфер чистить.

Crew 26-06-2003 22:09 208571

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

Vla2003 28-06-2003 19:23 208572

Вот этот код нормально работает на билдере 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 208573

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 208574

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 208575

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


Время: 14:10.

Время: 14:10.
© OSzone.net 2001-