Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> istream и считывание строки, независимо от пробела 
:(
    Опции темы
En_t_end
Дата 10.8.2005, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



Подскажите пожалуйста, потомки от istream(ifstream и cin) умеют ли считывать строку до '\n'. Допустим, когда файл имеет вид:
"некоторый масссив чаров" - далее следует перевод строки...
"другая информация" - далее следует перевод строки...
"следующий" - далее следует перевод строки...

Но надо, чтобы считывание, допустим в char[] не прекращалось даже при обнаружении пробела( как это происходит при >>, ибо пробел - это один из разделителей по умолчанию), но прекращалось, при обнаружении '\n'.
ЗЫ знаю вопрос тупой, но сколько не бился, не получалось такое сделать smile
Корень, как мне кажется лежит в ::getline() - там надо как-то выставить параметры хитро, чтобы считывание в моем слуае прекращалось на '\n'.
PM MAIL ICQ Skype GTalk Jabber   Вверх
Fixin
Дата 10.8.2005, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 2
Всего: 18



Самоделку проще сделать будет. ИМХО.
PM MAIL ICQ   Вверх
En_t_end
Дата 10.8.2005, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



Fixin
Проще то оно проще, да вот у меня уже в третьей программе такой глюк, надо же исправлять, там уже самоделку не сделать.
Добавлено @ 17:31
Кстати using std::getline - на это у меня чего компилер ругается. Говорит, что getline членом std не является, но это наглая ложь smile
А std::istream::getline() - работает как-то коряво smile
PM MAIL ICQ Skype GTalk Jabber   Вверх
Mayk
Дата 10.8.2005, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(En_t_end @ 10.8.2005, 21:29)
А std::istream::getline() - работает как-то коряво

Подробнее с этого моменента.
Код

  char buf[2048];
  cin.getline(buf,sizeof(buf));
  cout << buf << '@' <<endl;;

вроде нормально работает
ps. не соглашусь с тем, что самоделку проще делать. Обрабытывать backspace'ы, стрелки курсора и делеты очень муторно. Не сложно, но муторно. На мозги это обработка изрядно капает, когда подобное пишешь не в первый раз.

Это сообщение отредактировал(а) Mayk - 10.8.2005, 18:40


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
En_t_end
Дата 10.8.2005, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



Подчти в тему... пример самоделки, которая работает, но зато следующая информация за читаемой этой функцией читается не правильно smile
Код

char *GetLine_my(ifstream &config, char *str)
{
    unsigned int i = 0;
    while((str[i++]=config.get()) != '\n' && i != strlen(str));
    str[i] = '\0';
    return str;
}


Это сообщение отредактировал(а) En_t_end - 10.8.2005, 18:46
PM MAIL ICQ Skype GTalk Jabber   Вверх
En_t_end
Дата 10.8.2005, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



Короче, народ, я хочу примерно такого результата:
Код

ino >> str1; /* str1(char[]), в файле могут быть пробелы, они должны быть в str1*/
ino >> s_m; // некоторый BOOL
ino >> str2; /*Тот же эфект, как с str1*/
ino >> s_a; // BOOL


Это сообщение отредактировал(а) En_t_end - 10.8.2005, 19:05
PM MAIL ICQ Skype GTalk Jabber   Вверх
Mayk
Дата 10.8.2005, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Код

char* GetLine_my(istream& config, char *str)
{
    char* ostr = str;
    while((*str++=config.get()) != '\n' && str[-1])
        ;
    *str=0;
    return ostr;
}

НИКОГДА не используй strlen, если есть способ обойтись без него. Ошибка и тормоза(жутчайшие) именно в нём.
Добавлено @ 19:25
А всё же, чем readline не устраивет? GetLine_my делает по сути то же самое. Только я не уверен в эффективности.
Добавлено @ 19:28
Кстати, а разве get() в случае конца файла возвращает нуль? Или для чего тогда нужна i != strlen(str)


Это сообщение отредактировал(а) Mayk - 10.8.2005, 19:23


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Fixin
Дата 10.8.2005, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 2
Всего: 18



Цитата
str[-1])
А если в строке 257 символов?
Добавлено @ 21:13
И это не обязательно начало массива...
PM MAIL ICQ   Вверх
Mayk
Дата 10.8.2005, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(Fixin @ 11.8.2005, 01:11)
А если в строке 257 символов?

Да хоть трилиард.
Цитата(Fixin @ 11.8.2005, 01:11)
И это не обязательно начало массива...

str[-1] это не начало массива. Это элемент массива, в который был считан символ.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Fixin
Дата 10.8.2005, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 2
Всего: 18



Сорри.
PM MAIL ICQ   Вверх
En_t_end
Дата 11.8.2005, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



Кстати проблема с считыванием последующих данных(после юзания функцит) так и осталась smile
Но я её обошел по варварски smile разделил конфиг на три части smile Теперь работает.
PM MAIL ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0571 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.