Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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* Проще надо и без затей, а не морочить голову исключениями и другой ерундой не относящейся к делу... |
|
Вернуться к началу |
|
|
|