Форум: Форум C++Разное
Новые темы: 00
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: getline() - по разному работает в разных компиляторах
 
 автор: Alex_dp   (07.01.2008 в 18:04)   письмо автору
 
 

Пожалуйста помогите разобраться с getline :).
Есть код типа приведенного ниже. Мне необходимо вводить символы 1 строчкой, размещая их в buff1, buff2 и в buff3. Ниже приведенный код скомпилированный в Visual C++6.0 позволяет это делать без проблем, т. е. заполнять эти 3 масива вводя символы в 1 строку и ENTER.
Но ЭТОТ ЖЕ КОД скомпилированный в Borland C++ Compiler 5.5 работает по другому: первые 3 символа из строчки помещаются в buff1, но следующие игнорируются. Вместо них пустые строки. Например, если ввести в строку аааbbbccс и нажать ENTER, то при выводе имеем:
Billo vvedeno ааа
Billo vvedeno
Billo vvedeno
Подскажите, пожалуйста, кто-нибудь, в чем проблема? Глюк компилятора или некорректный код? Такую проблему можна было бы наверное ожидать для функции get, но для getline(?) getline же ведь отбрасывет прочитанный символ-ограничитель из потока. Заранее спасибо.


#include <iostream.h>
#include <conio.h>

main()
{
char buff1[4], buff2[4], buff3[4];
cin.getline(buff1, 4);
cin.getline(buff2,4);
cin.getline(buff3,4);

cout<<endl<<"Billo vvedeno "<<buff1<<endl;
cout<<endl<<"Billo vvedeno "<<buff2<<endl;
cout<<endl<<"Billo vvedeno "<<buff3<<endl;
getch();
return 0;
}

  Ответить  
 
 автор: cheops   (08.01.2008 в 06:58)   письмо автору
 
   для: Alex_dp   (07.01.2008 в 18:04)
 

Вообще-то Borland C++ Compiler 5.5 здесь более прав, согласно стандарту C++ метод getline() считывает n - 1 символов из стандартного ввода, последний символ строки необходимо для того, чтобы поместить туда признак конца строки '\0'.

PS В Visual C++6.0 достаточно старенький компилятор - он может не все требования стандарта поддерживать.

  Ответить  
 
 автор: Alex_dp   (08.01.2008 в 13:26)   письмо автору
 
   для: cheops   (08.01.2008 в 06:58)
 

Да, в описании getline() сказано про n-1. Но я ведь 3 раза подряд использую getline(). Почему же срабатывает только первая getline()? Мне нужно, чтобы работали все три, считывая по n-1 символу каждая из одной строки.

У меня такое впечатление, что в скомпилированной Borland C++ Compiler 5.5 проге последующие (2 и 3 getline() ) считывают только символ ограничитель из потока и все. Но этого не должно быть, исходя из того же описания getline(): символ ограничитель читается getline() и отбрасывается.

  Ответить  
 
 автор: cheops   (09.01.2008 в 06:01)   письмо автору
 
   для: Alex_dp   (08.01.2008 в 13:26)
 

Вы какие данные вводите (чтобы ситуацию воспроизвести)?

  Ответить  
 
 автор: Alex_dp   (09.01.2008 в 12:36)   письмо автору
 
   для: cheops   (09.01.2008 в 06:01)
 

Спасибо за интерес и участие в моей проблеме.

Компилирую программу в Borland C++ Compiler 5.5. Ввожу аааbbbccс и ENTER. Получаю результат:
Billo vvedeno ааа
Billo vvedeno
Billo vvedeno

Компилирую ту же программу в Visual C++6.0 . Ввожу аааbbbccс и ENTER. Получаю результат:
Billo vvedeno ааа
Billo vvedeno bbb
Billo vvedeno ccc

Получается, что скомпилированная более старым компилятором (Visual C++6.0) прога работает так как и ожидается, правильно. Но прога скомпилированная Borland C++ Compiler 5.5 по другому, не так как мне надо. Странно. А мне важно, чтобы компилировать в Borland C++ Compiler 5.5.

  Ответить  
 
 автор: cheops   (10.01.2008 в 06:46)   письмо автору
 
   для: Alex_dp   (09.01.2008 в 12:36)
 

Хм... неприятная штука, в принципе это не противоречит стандарту - чтение завершается, если следующий символ является символом новой строки соответствующей кодировки. Судя по всему Borland-ский компилятор читает всю строку до первого первода, а дальше решает, сколько от неё откусить. Вам обязательно readline() необходимо воспользоваться? Может подойдёт метод read()?
#include <iostream.h>
#include <conio.h>

main()
{
  char buff1[4] = "   ", buff2[4] = "   ", buff3[4] = "   ";
  cin.read(buff1,3);
  cin.read(buff2,3);
  cin.read(buff3,3);

  cout<<endl<<"Billo vvedeno "<<buff1<<endl;
  cout<<endl<<"Billo vvedeno "<<buff2<<endl;
  cout<<endl<<"Billo vvedeno "<<buff3<<endl;
  getch();
  return 0;
}

Он правда менее удобен тем, что читает ровно указанное количество символов, поэтому о завершающем строку нулевом байте '\0' нужно заботиться самостоятельно, либо иницируя строки, как указано выше, либо выставляя нулевой байт вручную
#include <iostream.h>
#include <conio.h>

main()
{
  char buff1[4], buff2[4], buff3[4];
  cin.read(buff1,3);
  cin.read(buff2,3);
  cin.read(buff3,3);

  buff1[4] = '\0';
  buff2[4] = '\0';
  buff3[4] = '\0';

  cout<<endl<<"Billo vvedeno "<<buff1<<endl;
  cout<<endl<<"Billo vvedeno "<<buff2<<endl;
  cout<<endl<<"Billo vvedeno "<<buff3<<endl;
  getch();
  return 0;
}

  Ответить  
 
 автор: Alex_dp   (11.01.2008 в 17:29)   письмо автору
 
   для: cheops   (10.01.2008 в 06:46)
 

Дело в том, что getline я хотел раобрать со своими учениками. :) А тут такая досада :). Но все равно, Вам большое спасибо.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования