LINUX.ORG.RU

getline


0

1

Проблема такова. При первом вызове getline, он автоматически сам считывает первое значение "", т. е. пустую строку. С чего бы? До этого вводил с клавиатуры число cin >> numOfDir.

string buff;
  for (int i = 0; i <= numOfDir; i++)
    {
      getline( cin, buff );
      list.push_back( buff );
    }

Нашел решение, numOfDir объявлена как глобальная переменная, и в функцию я ее не передавал. Когда передал ее по указателю, заработала. Но так и не понятно почему? ведь глобальная переменная может быть вызвана из любого места?

так проблема в чём? в считывании строки или в глобальных переменных?

anonymous ()
Ответ на: комментарий от anonymous

то что getline не дает ввести первое значение, она заносит сама автоматически пустую строку и при втором пробеге цикла дает вводить значение. В итоге если мне надо добавить 3 значения в вектор, я получаю 1 пустую строку и 2 нужных.

JuST_KoReaN ()
Ответ на: комментарий от JuST_KoReaN

Никаких проблем нет. Что введено, то и выводит.

#include <iostream>
using namespace std;
int main(int, char *[])
{   
    string buff;
    for (;;)
    {
        cout << "input: ";
        getline( cin, buff );
        cout << "output: " << buff << endl;
    }
    return 0;
}

anonymous ()

чисто догадка: после cin в буффере остаётся \n, которую потом считывает getline

invy ★★★★★ ()

Пробелы скипнуть нужно перед чтением строки:

std::cin >> std::ws;
schizoid ★★★ ()
Ответ на: комментарий от encyrtid
int main()
{
  string inFormat;
  string outFormat;


  do
    {
      cin >> inFormat;
      cin >> outFormat;
      cin >> numOfDir;
      inF = checkFormat(&inFormat);
      outF = checkFormat(&outFormat);
    } while (inF == -1 || outF == -1 || numOfDir < 0);

  getList(&numOfDir);
  printList(&numOfDir);  


  
  return 0;
}

int checkFormat(const string *format)
{
  for (int i = 0; i < 6; i++)
    {
      if (*format == formats[i])
	return i;
    }
  return -1;
}

void getList(const int *numOfDir)
{
  string buff;
  for (int i = 0; i <= *numOfDir; i++)
    {
      getline( cin, buff );
      list.push_back( buff );
    }
}

void printList(const int *numOfDir)
{
  for (int i = 0; i < *numOfDir; i++)
    {
      cout << list[i] << endl;
    }
}
[[code]]

Вот весь код. Все переменные объявлены.
JuST_KoReaN ()
Ответ на: комментарий от encyrtid

Всем спасибо.

cin >> ws;
[[code]]

помогло. std::ws сбрасывает пробелы, а cin.ignore(cinrdbuf()->in avail()) сбрасывает даже все выводы на экран cout?
JuST_KoReaN ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.