|
|
|
| Пожалуйста помогите разобраться с 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;
} | |
|
|
|
|
|
|
|
для: Alex_dp
(07.01.2008 в 18:04)
| | Вообще-то Borland C++ Compiler 5.5 здесь более прав, согласно стандарту C++ метод getline() считывает n - 1 символов из стандартного ввода, последний символ строки необходимо для того, чтобы поместить туда признак конца строки '\0'.
PS В Visual C++6.0 достаточно старенький компилятор - он может не все требования стандарта поддерживать. | |
|
|
|
|
|
|
|
для: cheops
(08.01.2008 в 06:58)
| | Да, в описании getline() сказано про n-1. Но я ведь 3 раза подряд использую getline(). Почему же срабатывает только первая getline()? Мне нужно, чтобы работали все три, считывая по n-1 символу каждая из одной строки.
У меня такое впечатление, что в скомпилированной Borland C++ Compiler 5.5 проге последующие (2 и 3 getline() ) считывают только символ ограничитель из потока и все. Но этого не должно быть, исходя из того же описания getline(): символ ограничитель читается getline() и отбрасывается. | |
|
|
|
|
|
|
|
для: Alex_dp
(08.01.2008 в 13:26)
| | Вы какие данные вводите (чтобы ситуацию воспроизвести)? | |
|
|
|
|
|
|
|
для: 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. | |
|
|
|
|
|
|
|
для: 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;
} |
| |
|
|
|
|
|
|
|
для: cheops
(10.01.2008 в 06:46)
| | Дело в том, что getline я хотел раобрать со своими учениками. :) А тут такая досада :). Но все равно, Вам большое спасибо. | |
|
|
|