ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

проблемы с getline
  #1  
Старый 20.10.2009, 23:28
Аватар для cupper
cupper
Постоянный
Регистрация: 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";
}
 
Ответить с цитированием

  #2  
Старый 20.10.2009, 23:50
Аватар для scrat
scrat
Постоянный
Регистрация: 08.04.2007
Сообщений: 853
Провел на форуме:
5812656

Репутация: 1540


Отправить сообщение для scrat с помощью ICQ
По умолчанию

а зачем getline? можно же fstream'омвским оператором >> пользоваться
 
Ответить с цитированием

  #3  
Старый 21.10.2009, 00:07
Аватар для Nikituki
Nikituki
Новичок
Регистрация: 14.03.2009
Сообщений: 25
Провел на форуме:
72034

Репутация: 5
Отправить сообщение для Nikituki с помощью ICQ
По умолчанию

Код:
cin >> strlineMatrix;
 
Ответить с цитированием

  #4  
Старый 21.10.2009, 11:27
Аватар для cupper
cupper
Постоянный
Регистрация: 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..
 
Ответить с цитированием

  #5  
Старый 21.10.2009, 13:12
Аватар для razb
razb
Постоянный
Регистрация: 24.03.2009
Сообщений: 670
Провел на форуме:
2868783

Репутация: 414


Отправить сообщение для razb с помощью ICQ
По умолчанию

Перед вызовом
Код:
getline()
сделай:
Код:
cin.sync()
_http://www.cplusplus.com/reference/iostream/istream/sync/

Последний раз редактировалось razb; 21.10.2009 в 13:14..
 
Ответить с цитированием

  #6  
Старый 19.11.2009, 18:00
Аватар для Roston
Roston
Постоянный
Регистрация: 31.07.2008
Сообщений: 370
Провел на форуме:
2866942

Репутация: 350
Отправить сообщение для Roston с помощью ICQ
По умолчанию

а разве не должно быть cin.getline()?
И вопше, если ты на С++ то просто делай не char а string.

Последний раз редактировалось Roston; 19.11.2009 в 18:02..
 
Ответить с цитированием

  #7  
Старый 19.11.2009, 21:26
Аватар для ~Shapaev~
~Shapaev~
Новичок
Регистрация: 24.10.2009
Сообщений: 26
Провел на форуме:
306200

Репутация: 10
По умолчанию

cin.getline как раз таки юзают при использовании хедера string.h(Си) то бишь массив чаров , а у него тут переменная как стринг объявлена , Roston, думаю ты прав насчет того что нужно использовать эту функцию, но тогда и использовать надо char.
 
Ответить с цитированием

  #8  
Старый 19.11.2009, 22:18
Аватар для Roston
Roston
Постоянный
Регистрация: 31.07.2008
Сообщений: 370
Провел на форуме:
2866942

Репутация: 350
Отправить сообщение для Roston с помощью ICQ
По умолчанию

ТС... выдели кусок кода где именно не читается... и вопше просто попробуй читать строку в отдельной програме,а когда найдеш выход то сунь ее в свою.
Если ты например делаеш так
Код:
char text[100];
cout<<"Введите текст";
cin.getline(text,100);
cout<<text;
должно работать
 
Ответить с цитированием

  #9  
Старый 20.11.2009, 00:31
Аватар для Mystic.asm
Mystic.asm
Новичок
Регистрация: 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..
 
Ответить с цитированием

  #10  
Старый 20.11.2009, 20:47
Аватар для beerka
beerka
Новичок
Регистрация: 13.01.2009
Сообщений: 1
Провел на форуме:
26219

Репутация: 0
По умолчанию

Считывайте всё в строку, а потом её разбирайте(можно её даже запихать в sstream). Проблем и багов будет в 100 раз меньше
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Медведев читает свой ЖЖ и решает проблемы [BES] Мировые новости 11 08.10.2009 18:32
У Elpida проблемы с памятью? Eff0rd Новости мира "железа" 1 09.07.2009 23:00
[99.7%] решение проблемы с icq AlexV ICQ 88 25.01.2009 13:31
Основные проблемы, связанные с железом. last_root Аппаратное обеспечение 11 15.01.2009 13:21
Возникли проблемы в работе альтернативных клиентов Icq dinar_007 Мировые новости 4 11.02.2006 13:19



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ