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





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] а если не уверен? Путь может быть любой... 14.10.02 14:20  Число просмотров: 1084
Автор: 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;
<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