Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2012, 19:41   #1
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
Плохо Динамически узнать размер строки в файле [C++]

Появилась вдруг вот необходимость считать из файла некоторые строки, но считать не просто так, а считать их в динамический символьный массив. И, естественно, STL использовать нельзя.
Но как мне узнать размер считываемой строки, чтобы правильно память выделить? Что-то вот совсем ума не приложу.

Единственное, что приходит в голову, это запомнить положение в файле, где находится начало строки, потом считывать до появления '\n', затем вычитать одно из другого, получая тем самым размер строки. Затем переставлять указатель на позицию начала строки и читать.

Но не муторно ли?
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 26.11.2012, 19:59   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

Как такой вариант?
Код:
enum { START_RESERVE_SIZE = 80 };

char *
getline2(FILE *f)
{
    char *str = NULL;
    int reserve = 0, count = 0, c = 0;
    while (c != '\n' && (c = getc(f)) != EOF) {
        if (count == reserve) {
            if (!(reserve *= 2)) {
                reserve = START_RESERVE_SIZE;
            }
            str = realloc(str, reserve * sizeof(str[0]));
        }
        str[count++] = c;
    }
    if (str) {
        str = realloc(str, (count + 1) * sizeof(str[0]));
        str[count] = 0;
    }
    return str;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 26.11.2012, 21:21   #3
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
Как такой вариант?
Вариант, как вариант. Только написан на чистых сях, а мне бы на плюсах: с потоками и развратными женщинами Ну и new конечно. Я просто думал где-нибудь данная функция уже заложена, а я о ней просто ни слухом ни духом. Интересно, как string внутри устроен...
А вообще, подобный вариант по-моему более ресурсозатратен, нежели предложенный мной с запоминанием позиции в файле, т.к. приходится при больших строках по много раз выделять память.

Спасибо, что откликнулись.
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.

Последний раз редактировалось MooNDeaR; 26.11.2012 в 21:24.
MooNDeaR вне форума Ответить с цитированием
Старый 26.11.2012, 21:32   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

Ну на плюсах я не пишу (пока что).
Да, Ваш вариант, наверное, менее затратен.
(Хотя перевыделений памяти не так уж много, для 1000000 символов - примерно 14 перевыделений).
Пожалуйста.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 26.11.2012, 21:46   #5
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
(Хотя перевыделений памяти не так уж много, для 1000000 символов - примерно 14 перевыделений)
Стоит учесть, что будет копироваться весь 1 000 000 символов.
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 26.11.2012, 21:55   #6
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

MooNDeaR

Только написан на чистых сях, а мне бы на плюсах

если не использовать stl, то оно ничем не будет отличаться, ибо сведется к "Си с классами"

с потоками

а это уже stl oO
Rififi вне форума Ответить с цитированием
Старый 26.11.2012, 22:20   #7
LancX
Пользователь
 
Аватар для LancX
 
Регистрация: 30.04.2012
Сообщений: 52
По умолчанию

Посчитать количество символов в файле или отравить файловый указатель в конец файла и получить значение его положение(думаю последнее быстрее)
Вернуть внутри файловый указатель в начало файла,
Выделить через new необходимый размер,
Считывать.

Жаль, пока не встречал литературы, где что то было написано подробно о работе с текстовыми файлами и что лучше использовать.
При любом расчете, число, правильность которого для всех очевидна, становится источником ошибок.
LancX вне форума Ответить с цитированием
Старый 27.11.2012, 15:59   #8
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
а это уже stl oO
И в каком же месте потоки стали частью STL? В STL записаны шаблоны классов list, queue и т.п., а cout и cin являются объектами классов ostream и istream, которые, как можно заметить, вообще никаких шаблонов-то и не имеют.
Цитата:
если не использовать stl, то оно ничем не будет отличаться, ибо сведется к "Си с классами"
Какое всё-таки неверное понимание STL.
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Узнать размер и длину песни Манжосов Денис :) Мультимедиа в Delphi 5 27.12.2011 03:23
узнать размер файла Артэс Общие вопросы C/C++ 4 31.05.2010 14:30
Узнать размер файла более 4 гб Asteroid Работа с сетью в Delphi 6 30.11.2009 15:22
узнать размер картинки cooperOk JavaScript, Ajax 6 15.11.2009 15:36
Как изменить динамически менять размер плавающего фрейма, к-й находится в ячейке таблицы? 3lander HTML и CSS 8 26.05.2008 19:54