информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Spanning Tree Protocol: недокументированное применениеГде водятся OGRыВсе любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
[C++] а если не уверен? Путь может быть любой... 14.10.02 04:19  Число просмотров: 1304
Автор: Dr. Nebula Статус: Незарегистрированный пользователь
<"чистая" ссылка>
<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-2025 Dmitry Leonov   Page build time: 1 s   Design: Vadim Derkach