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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> fstream и разделители 
:(
    Опции темы
Xenon
Дата 25.12.2006, 03:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 11
Всего: 50



С помощью fstream очень удобно считывать слова разделенные пробелами в строке: file >> var1 >> var2 >> var3;
А что делать, если у меня в текстовом файле "слова" разделены другими знаками? ";" допустим. Разве нельзя поменять какой-то флаг, чтобы fstream кушал нормально и не надо было считывать посимвольно до того, как встречу ";"?


--------------------
user posted image  
PM MAIL   Вверх
zabivator
Дата 25.12.2006, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Xenon, присоединяюсь к вопросу. Так и не нашел  smile 
--------------------
#include <zabivator>int main( int, char * [] ){   while( Zabivator::жив() ) Zabivator::моск()++;   return 0;}
PM MAIL WWW ICQ   Вверх
GIK
Дата 25.12.2006, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

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



Что то, непонятно как то???
Что мешает проверять символы? Напишы олгоритм который пропускает соответствующий знак?

Есть еще функция char fill(char ch) которая меняет символ заполнитель в стандартных потоках cin, cout, но она тебе наверно не подойдет.


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
Daevaorn
Дата 25.12.2006, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Xenon @  25.12.2006,  04:56 Найти цитируемый пост)
Разве нельзя поменять какой-то флаг, чтобы fstream кушал нормально и не надо было считывать посимвольно до того, как встречу ";"? 

нельзя. числа ещё можно так читать, а вот строки нет.
Цитата(Xenon @  25.12.2006,  04:56 Найти цитируемый пост)
А что делать, если у меня в текстовом файле "слова" разделены другими знаками?

читать построчно, а потом парсить на наличие нужного разделителя.
PM MAIL WWW   Вверх
oper54
Дата 25.12.2006, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



считай весь файл в массив и там уже разбирай...
PM MAIL   Вверх
Xenon
Дата 25.12.2006, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 11
Всего: 50



Считать весь массив дурак не сможет и посимвольно тоже, но так удобно использовать конструкции file >> bla >> bla1 ... А тут придется парсить и т.д. и т.п. Ну гораздо более громоздкий листинг. Где-то же хранится а fstream этот разделитель " ", значит как-то можно его заменить?


--------------------
user posted image  
PM MAIL   Вверх
Romikgy
Дата 25.12.2006, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Xenon, а среда разработки какая?
Ps имхо можно создать класс который будет этим заниматся


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
W4FhLF
Дата 25.12.2006, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



Xenon, дай пример того как ты парсиш файл, где разделителем является пробел, заносишь значения в переменные и выводишь на экран это дело. Есть идеи, надо проверитьsmile


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Xenon
Дата 25.12.2006, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 11
Всего: 50



Да создать можно все smile
У меня 5 переменных и файл, в котором 5 колонок. Так как в словах могут быть пробелы, столбцы разделены знаками ";" (так при экспорте эксель сделал).
Я делал так (когда еще не делал возможности вводить словами с пробелами):
Код

void import_txt()
{
    fstream file;
    cout << "Enter path: ";
    getline(cin,path_txt);
    file.open(path_txt.c_str(),std::ios::in);
    if(!file)
    {
        throw ("Coudn`t open file\n");
    }
    int year;
    string artist;
    string genre;
    string title;
    cout << "Reading file";
    while(!file.eof())
    {
        cout << "."; //To show, that something happens :)
        file >> artist >> title >> genre >> year;
        if(file.fail()) 
        {
            file.clear();
            break;        
        }            
        add_album(year, genre, artist, title);        
    }
    file.close();
    cout << "Ok\n";
}


А теперь на каждую переменную, получается, я должен вешать хрень, аля:
Код

char ch;
do
{
     file.get(ch);
     artist+=ch;
}while(ch!=';');

Но это не очень удобно по сравнению с file >> artist >> title >> genre >> year; Думал можно какой-нибудь флаг сменить, а судя по всему нет ...
Еще раньше делал file.getline() , сувал в буфер и парсил, но это тоже не сильно удобнее штатного с потоками ...

Добавлено @ 15:42 
Romikgy, Visual Studio 2005

Это сообщение отредактировал(а) Xenon - 25.12.2006, 15:43


--------------------
user posted image  
PM MAIL   Вверх
maxim1000
Дата 25.12.2006, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 17
Всего: 110



можно считать строку, а потом пользоваться std::stringstream
синтаксис такой же, только можно строку, как угодно изменить перед использованием (например, позаменять символы)


--------------------
qqq
PM WWW   Вверх
Xenon
Дата 25.12.2006, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 11
Всего: 50



maxim1000, а что ты предлагаешь сделать? Заменить " " на что-нибудь, ";" на " ", потом считать файл так, как я это делал раньше, а затем то что-нибудь заменить на пробелы?  Тоже как-то ... smile


--------------------
user posted image  
PM MAIL   Вверх
Rockie
Дата 25.12.2006, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(Xenon @  25.12.2006,  15:00 Найти цитируемый пост)
Считать весь массив дурак не сможет и посимвольно тоже, но так удобно использовать конструкции file >> bla >> bla1 ... А тут придется парсить и т.д. и т.п. Ну гораздо более громоздкий листинг.


впринцыпе чтобы не парсить есть replace()..
Xenon, а в файле как расположен текст?
так:
text ; text
или так?
text; text
если первый случай, то 

Код
string garbage;
file >> artist >> garbage >> genre;


То есть тоже читаешь ";", но ничего с этим символом не делаешь. Если второй случай - то imho только парсить.


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Xenon
Дата 25.12.2006, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 11
Всего: 50



Rockie, Текст расположен так:
Код

John Petrucci;Suspended Animation;Progressive Metal;2006
Metallice;St. Anger;Metal;2004

Не получится как ты пределагаешь, потому что в некоторых местах название из двух слов, в некоторых из одного.



--------------------
user posted image  
PM MAIL   Вверх
Rockie
Дата 25.12.2006, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(Xenon @  25.12.2006,  16:23 Найти цитируемый пост)
Не получится как ты пределагаешь, потому что в некоторых местах название из двух слов, в некоторых из одного.

Xenon, тогда каким образом
Цитата(Xenon @  25.12.2006,  15:00 Найти цитируемый пост)
так удобно использовать конструкции file >> bla >> bla1




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
maxim1000
Дата 25.12.2006, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 17
Всего: 110



Цитата(Xenon @  25.12.2006,  14:52 Найти цитируемый пост)
maxim1000, а что ты предлагаешь сделать? Заменить " " на что-нибудь, ";" на " ", потом считать файл так, как я это делал раньше, а затем то что-нибудь заменить на пробелы?  Тоже как-то ... 

не, сначала считать из файла в строку, потом заменить в строке нужные разделители на " ", сконструировать из неё stringstream и загружать из него всй тем же >>

но это так... просто вариант...


--------------------
qqq
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1209 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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