Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

ПОМОГИТЕ!!! Как в частности в С++ сделать строки файла элементами массива.

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
Focus
Гость





СообщениеДобавлено: Пн Ноя 26 2001 12:47    Заголовок сообщения: ПОМОГИТЕ!!! Как в частности в С++ сделать строки файла элементами массива. Ответить с цитатой

Вот у меня такая проблемка появилась. Помогите кто может.
Нужно завести массив, элементы которого будут строки из файла. При этом количество строк в файле изменяется.
Вернуться к началу
Daemon



Зарегистрирован: 27.09.2002
Сообщения: 12

СообщениеДобавлено: Пн Ноя 26 2001 13:10    Заголовок сообщения: Re: ПОМОГИТЕ!!! Как в частности в С++ сделать строки файла элементами массива. Ответить с цитатой

Если файл один раз парсить, то делаешь
связанный список, элементами которого являются
строки, после засасывания файла - массив под
эти строки распределяешь (сколько места надо
уже известно) и строки туда, а список - удалить.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Focus
Гость





СообщениеДобавлено: Вт Ноя 27 2001 05:54    Заголовок сообщения: Re: ПОМОГИТЕ!!! Как в частности в С++ сделать строки файла элементами массива. Ответить с цитатой

Если можно, то исходник этого чуда пришли пожалуйста на мыло или в форуме.
Вернуться к началу
ilyasov
Гость





СообщениеДобавлено: Ср Ноя 28 2001 23:56    Заголовок сообщения: Re: ПОМОГИТЕ!!! Как в частности в С++ сделать строки файла элементами массива. Ответить с цитатой

Есть простой вариант. Файл целиком считывается в массив типа char*. При этом определение размера этого массива -элементарное, размер просто совпадаетс с размером файла. В процессе считывания строк из файла в массив считаем количество строк в файле. Далее заводим массив указателей на строки, числом по количеству строк в файле. Следующим этапом устанавливаем в элементы этого массива правильные ссылки на позиции строк файла, уже хранящиеся в памяти. И, наконец, заменяем в нашей копии файла в памяти символы перевода строки (12 десятичное, если не ошибаюсь) на нулевой байт (дабы были правильно определены концы строк. На этом теряется дополнительная память, равная количеству строк в файле (в байтах), если файл Win* или DOS (ибо там в конце каждой строки два невидимых байта). В UNIX этого не произойдет -там конец строки обозначается только одним символом -переводом строки.
Вернуться к началу
Константин



Зарегистрирован: 06.11.2002
Сообщения: 230

СообщениеДобавлено: Чт Ноя 29 2001 04:07    Заголовок сообщения: Re: ПОМОГИТЕ!!! Как в частности в С++ сделать строки файла элементами массива. Ответить с цитатой

Несколько дополнений к сказанному ilyasov:

1. Перевод строки - 10 десятичное (а не 12.) В C можно написать '\n'.
2. Возврат каретки - 13 десятичное. В C можно написать '\r'.
3. В Win/OS2/DOS - NewLine == \r+\n, в UNIX - '\n', в MacOS - '\r', однако если файл открыт в текстовом режиме и читается построчно - это неважно, NL всегда будет как принято в UNIX и в C (т. е. '\n' или 10 или '\x0A'.)
4. Если читать fgets - будет добавлен, а кроме того останется '\n' (если был прочитан.)

Кроме этих дополнений готов привести код со следующими оговорками:

1. Этот код не отлаживался и даже не компилировался для поиска синтаксич. ошибок, т. к. под рукой в данный момент нет компилятора. Поэтому заранее извиняюсь за возможные баги и рекомендую все проверить, а не доверять на слово.

2. Код C++, т. к. описания стоят в произвольных местах и используется new.

3. Таких деталей, как проверка возвращения NULL функцией fopen(), генерации исключения оператором new, проверка - не пустой ли файл (тогда new[i] - неверно) и пр. здесь нет.

ФРАГМЕНТ КОДА:

/*******************/
FILE* f = fopen("any_file.txt", "rt");
char tmp_buf[MAX_STRING+1];
int i = 0;
while(!feof(f)) // считаем число строк.
{
++ i;
// MAX_STRING - максимальная длина строки в файле:
fgets(tmp_buf, MAX_STRING, f);
}
int isize = ftell(f);
fseek(f, 0, SEEK_SET);
char* buf = NULL; // Динамический массив для данных строк.
char** psz = NULL; // Динамический массив указателей на эти строки.
psz = new (char*)[i];
buf = new char[isize+i]; // Память распределяется с учетом добавления '\0';
i = 0;
int j = 0;
while(!feof(f)) // Заполняем массивы.
{
fgets(buf[j], MAX_STRING, f);
psz[i] = &buf[j];
++i;
j += strlen(&buf[j])+1;
}
fclose(f); // Закрываем файл, после отработки с данными надо не забыть т/ж вызвать delete.
/*******************/
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
ilyasov
Гость





СообщениеДобавлено: Сб Дек 01 2001 01:17    Заголовок сообщения: Re: ПОМОГИТЕ!!! Как в частности в С++ сделать строки файла элементами массива. Ответить с цитатой

Писал же, файл считываем сразу и весь!
Строки считаем в процессе заполнения массива в памяти данными из файла (дешево и сердито).
Размер резервируемого массива определяем по размеру файла. Временного буфера для чтения строк тоже не нужно, читать файл надо побайтово в бинарном виде, опять же не возникнет вопросов с определением максимальной длины строки.
Читать надо внимательно!
Кстати, если не промахнулся, ошибочка в коде
fgets(buf[j], MAX_STRING, f);
т.к buf описан как char*
Проще надо и без затей, а не морочить голову исключениями и другой ерундой не относящейся к делу...
Вернуться к началу
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...