информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
За кого нас держат?Атака на InternetВсе любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Блокировка российских аккаунтов... 
 Отзыв сертификатов ЦБ РФ, ПСБ,... 
 Памятка мирным людям во время информационной... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] VC++ Построковое чтение из файла и split 14.10.02 02:45  Число просмотров: 2830
Автор: ggg <ggg> Статус: Elderman
<"чистая" ссылка>
> Народ, вопрос может на уровне идиотизма, но как это сделать
> с VC - не знаю, в Перле проще :)
> Имеется текстовый файл, с данными разделенными ";"
> каждая строка - одна запись типа
>
> c:\windows\logo.bmp;10.10.2002
>
> нужно построчно пройтись по файлу и забрать эти данные в
> переменные...
> желательно в разные :)
> никто не подскажет?

самое простое так:

ifstream file(filename, ios::nocreate);
char line[1024];
while(file)
{
file.getline(line, sizeof(line));
if(!file) break;

char* delim = strchr(line, ';');

char* fn = line;
char* date = delim;
if(date)
{
*date = 0;
date++;
};

// ...
};
<programming>
[C++] VC++ Построковое чтение из файла и split 14.10.02 01:01  
Автор: Dr. Nebula Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Народ, вопрос может на уровне идиотизма, но как это сделать с VC - не знаю, в Перле проще :)
Имеется текстовый файл, с данными разделенными ";"
каждая строка - одна запись типа

c:\windows\logo.bmp;10.10.2002

нужно построчно пройтись по файлу и забрать эти данные в переменные...
желательно в разные :)
никто не подскажет?
[C++] VC++ Построковое чтение из файла и split 14.10.02 02:45  
Автор: ggg <ggg> Статус: Elderman
<"чистая" ссылка>
> Народ, вопрос может на уровне идиотизма, но как это сделать
> с VC - не знаю, в Перле проще :)
> Имеется текстовый файл, с данными разделенными ";"
> каждая строка - одна запись типа
>
> c:\windows\logo.bmp;10.10.2002
>
> нужно построчно пройтись по файлу и забрать эти данные в
> переменные...
> желательно в разные :)
> никто не подскажет?

самое простое так:

ifstream file(filename, ios::nocreate);
char line[1024];
while(file)
{
file.getline(line, sizeof(line));
if(!file) break;

char* delim = strchr(line, ';');

char* fn = line;
char* date = delim;
if(date)
{
*date = 0;
date++;
};

// ...
};
... если уверен, что строчки короткие 14.10.02 02:47  
Автор: ggg <ggg> Статус: Elderman
<"чистая" ссылка>
[C++] а если не уверен? Путь может быть любой... 14.10.02 04:19  
Автор: Dr. Nebula Статус: Незарегистрированный пользователь
<"чистая" ссылка>
[C++] а если не уверен? Путь может быть любой... 14.10.02 14:20  
Автор: ggg <ggg> Статус: Elderman
<"чистая" ссылка>
если нет требований по скорости, то что то типа этого

char* path = 0;
char* date = 0;

bool readpath = true;

ifstream f(...);
while(f)
{
__char c;
__f >> c;

__if(readpath)
__{
____if(c==';')
____{
______readpath = false;
______continue;
____};
____if(path)
____{
______unsigned length = strlen(path);
______char* tmp = new char[length+2];
______if(!tmp) break;
______strcpy(tmp, path);
______tmp[length] = c;
______tmp[length+1] = 0;
______delete[] path;
______path = tmp;
____}
____else
____{
______path = new char[2];
______if(!path) break;
______path[0] = c;
______path[1] = 0;
____};
__}
__else
__{
____if(c=='\n')
____{
______//
______// новая пара path - date
______//
______delete[] path;
______path = 0;
______delete[] date;
______date = 0;
______readpath = true;
______continue;
____};
____if(date)
____{
______unsigned length = strlen(date);
______char* tmp = new char[length+2];
______if(!tmp) break;
______strcpy(tmp, date);
______tmp[length] = c;
______tmp[length+1] = 0;
______delete[] date;
______date = tmp;
____}
____else
____{
______date = new char[2];
______if(!date) break;
______date[0] = c;
______date[1] = 0;
____};
__};
};

//
// и возможно ещё одна пара
//

delete[] path;
delete[] date;
Не согласен 21.10.02 15:43  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
istream::getline() или get() (не помню точно но по мойму getline, MSDN-а рядом нет) имеет третий опциональный параметр (char *buf, size_t bufsize, int delim = '\n')

В общем file.getline(buf, sizeof(buf), ';')

А путь даже в самих виндах чаще всего размером MAX_PATH ограничивается. Это 260 байт
Не согласен 21.10.02 17:11  
Автор: ggg <ggg> Статус: Elderman
<"чистая" ссылка>
если закладываешься на размер строки, то смотри мой первый ответ

а если хочешь поспорить у кого в этом случае универсальнее, то вот пример:
c:\windows\logo.bmp
c:\windows\logo.bmp;10.10.2002
Можно и поспорить :-) 22.10.02 17:37  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> если закладываешься на размер строки, то смотри мой первый
> ответ

Если уж совсем не делать предположений о длине строки, то в STL-е getline перегружается и так:

template<class _E, class _Tr, class _A> inline
    basic_istream<_E, _Tr>& __cdecl getline(basic_istream<_E, _Tr>& _I,
        basic_string<_E, _Tr, _A>& _X, const _E _D)
{
// skipped
}

---
Взято из VC++ 6.0 STL-а, так что названия переменных интуитивно понятные :-). А string как известно сам заботится о размещении и увеличении строки.
Короче можно и так:

using namespace std;
string s;
ifstream is("filename.ext");
getline(is, s, ';');

---

> а если хочешь поспорить у кого в этом случае универсальнее,
> то вот пример:
> c:\windows\logo.bmp
> c:\windows\logo.bmp;10.10.2002

Насколько я вообще понимаю в разборе форматированных данных, формат не меняется во всем файле. Иначе нужно вообще брать flex с bison-ом и писать парсер :-)))

А вот понятность и сопровождаемость моего варинта выше.

ЗЫ: Кстати, в данном случае в плане эффективности flex - идеальное решение. Быстрее вряд ли можно написать.

Бест Регардс,
Сергей
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2022 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach