Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |

20.10.2009, 23:28
|
|
Постоянный
Регистрация: 06.06.2007
Сообщений: 575
Провел на форуме: 1180737
Репутация:
180
|
|
проблемы с getline
В програме немогу считать гетлайном строку, просто пропускается этот оператор и все.
Я сижу уже весь дерганый %(
вот код, весь
Код:
#include <iostream>
#include <string>
#include <stdlib.h> //isdigit(int)
#include <vector>
using namespace std;
int menu_input(const string &);
int check_digit_expert(const string &);
void output_matrix(ostream &, vector<vector<bool> > &, const size_t, const int);
int main(){
int expert = menu_input("Enter quantity of experts N = ");
int dimension = menu_input("Enter quantity of dimension matrix n = ");
vector< vector<bool> > matrix(dimension, vector<bool>(dimension*dimension, 0));
string strlineMatrix;
for (int vec=0; vec<expert; vec++){
// вводим матрицу
cout<<"Please enter values "<<vec+1<<" matrix:\n";
cout<<"Begin enter\n";
int skip, count; // с какого символа и сколько копировать
int j;
for (int i=0; i<dimension; i++){
skip=0;
j=0;
/*ТУТА !!!!!!!*/ getline(cin, strlineMatrix);
cout<<strlineMatrix<<"\n\n";
for (int n=0; n<strlineMatrix.length(); n++){
while (strlineMatrix[n]==' '){++n;}
skip=n;
++n;
count=1;
while (strlineMatrix[n] !=' '){
++count;
++n;
}
cout<<string(strlineMatrix, skip, count)<<"-";
if (j>=dimension || (matrix[vec][i*dimension+j]=(bool)check_digit_expert(string(strlineMatrix, skip, count)))<0){
cout<<"TEMP 1\n";
return 1;
}
++j;
}
if (j != dimension){
cout<<"Incorrect quantity of the entered values\n"<<"To continue input ?(Y/n): ";
char key;
cin>>key;
if (key=='n') return 1;
else --i;
}
}
cout<<"End enter\n\n";
}
output_matrix(cout, matrix, dimension, 0);
//matrix.erase(matrix.begin(), matrix.end());
//----------
char a;
cin>>a;
//----------
}
int menu_input(const string &str){
/*
будет требовать ввести число экспертов до тех пока не введут корректно
возвращает введене число в int
*/
cout<<str;
string expert;
int iexpert=0;
while (1){
cin>>expert;
iexpert=check_digit_expert(expert);
if (iexpert<1){
cout<<"ERROR ENTER VALUE: you enter: \""
<<expert<<"\", needed digit >= 0\n"
<<"Please "<<str;
}
else return iexpert;
}
}
int check_digit_expert(const string &str){
/*
Если str число >=0 то возвращает int этого числа, иначе -1
*/
for (int i=0; i<str.length(); i++){
if (isdigit(str[i])==0){
return -1;
}
}
return atoi(str.c_str());
}
void output_matrix (ostream & out, vector<vector<bool> > & matrix, const size_t len, const int nummatrix){
out<<"\n---------MATRIX----------\n";
for (size_t i=0; i<len; ++i){
for (size_t j=0; j<len; ++j){
out<<matrix[nummatrix][i*len+j]<<" ";
}
out<<endl;
}
out<<"\n---------MATRIX----------\n";
}
|
|
|

20.10.2009, 23:50
|
|
Постоянный
Регистрация: 08.04.2007
Сообщений: 853
Провел на форуме: 5812656
Репутация:
1540
|
|
а зачем getline? можно же fstream'омвским оператором >> пользоваться
|
|
|

21.10.2009, 00:07
|
|
Новичок
Регистрация: 14.03.2009
Сообщений: 25
Провел на форуме: 72034
Репутация:
5
|
|
Код:
cin >> strlineMatrix;
|
|
|

21.10.2009, 11:27
|
|
Постоянный
Регистрация: 06.06.2007
Сообщений: 575
Провел на форуме: 1180737
Репутация:
180
|
|
Сообщение от Nikituki
Код:
cin >> strlineMatrix;
cin>> читает до первого пробела.
---------------
вся проблема в том что getline неработает корректно если перед ним уже читалась чтрока через cin>>
Вот пример, можете проверить
Код:
#include <iostream>
using namespace std;
int main(){
string str;
cin>>str;
cout<<str<<endl;
getline(cin, str);
cout<<str<<endl;
}
Превое что приходит в голову проста заменить все cin>> на getline.
а как если без этого ?
Последний раз редактировалось cupper; 21.10.2009 в 11:37..
|
|
|

21.10.2009, 13:12
|
|
Постоянный
Регистрация: 24.03.2009
Сообщений: 670
Провел на форуме: 2868783
Репутация:
414
|
|
Перед вызовом сделай: _http://www.cplusplus.com/reference/iostream/istream/sync/
Последний раз редактировалось razb; 21.10.2009 в 13:14..
|
|
|

19.11.2009, 18:00
|
|
Постоянный
Регистрация: 31.07.2008
Сообщений: 370
Провел на форуме: 2866942
Репутация:
350
|
|
а разве не должно быть cin.getline()?
И вопше, если ты на С++ то просто делай не char а string.
Последний раз редактировалось Roston; 19.11.2009 в 18:02..
|
|
|

19.11.2009, 21:26
|
|
Новичок
Регистрация: 24.10.2009
Сообщений: 26
Провел на форуме: 306200
Репутация:
10
|
|
cin.getline как раз таки юзают при использовании хедера string.h(Си) то бишь массив чаров , а у него тут переменная как стринг объявлена , Roston, думаю ты прав насчет того что нужно использовать эту функцию, но тогда и использовать надо char.
|
|
|

19.11.2009, 22:18
|
|
Постоянный
Регистрация: 31.07.2008
Сообщений: 370
Провел на форуме: 2866942
Репутация:
350
|
|
ТС... выдели кусок кода где именно не читается... и вопше просто попробуй читать строку в отдельной програме,а когда найдеш выход то сунь ее в свою.
Если ты например делаеш так
Код:
char text[100];
cout<<"Введите текст";
cin.getline(text,100);
cout<<text;
должно работать
|
|
|

20.11.2009, 00:31
|
|
Новичок
Регистрация: 20.08.2008
Сообщений: 2
Провел на форуме: 30695
Репутация:
0
|
|
Вообще-то после
cin >> str;
считывание остается на той же строке, поэтому для получения следующей строки необходимо считать из потока символ '\n' (перейти к следующей строке) оператором
getline(cin,str);
а уже потом считывать нужную строку тем же оператором
То есть просто добавь после cin >> оператор getline() или (что не рекомендую из-за более плохой читабельности кода) перед нужным getline добавь дополнительный getline(cin,str)
Последний раз редактировалось Mystic.asm; 20.11.2009 в 00:34..
|
|
|

20.11.2009, 20:47
|
|
Новичок
Регистрация: 13.01.2009
Сообщений: 1
Провел на форуме: 26219
Репутация:
0
|
|
Считывайте всё в строку, а потом её разбирайте(можно её даже запихать в sstream). Проблем и багов будет в 100 раз меньше
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|