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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2013, 09:10   #1
ilizard
Новичок
Джуниор
 
Регистрация: 16.11.2012
Сообщений: 2
По умолчанию Динамический массив под строку. Замкнутый круг.

Здравствуйте!
Программе подается текстовый файл. Надо его считывать построчно, и загонять в массив. То есть каждой строке должен соответствовать массив. Динамический. Используя malloc.

И я не понимаю: для того, чтобы создать динамический массив нужно узнать длину строки. Чтобы узнать длину, нужно строку считать, то есть создать массив. Замкнутый круг.

Помогите, пожалуйста, объясните!
ilizard вне форума Ответить с цитированием
Старый 02.06.2013, 10:03   #2
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Ну длинна строки не бесконечная.

1. Делаете (например) размером 255.
2. Считываете 255 символов.
3. Если считалось ровно 255, то скорее всего вы считали не всю строку. Делаете realloc своего массива, и возвращаетесь к п.2. Если считалось меньше 255 символов - вы считали всю строку. идите к п.4.
4. С помощью realloc урезаете массив до нужного размера.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 02.06.2013, 14:33   #3
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Можно просканировать всеь файл и, с помощью цикла, выяснить кол-во элементов в нем.. да и строк тоже
На основе полученных данных можем считывать строки из файла в динамический массив.

E.G:
for (int i = 0; (ch = getc(file) ) != EOF; i++)
Igor95 вне форума Ответить с цитированием
Старый 02.06.2013, 14:40   #4
alexelev
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 26
По умолчанию

а почему именно так? есть же возможность определить сразу размер файла:
Код:
#include <io.h>
#include <cstdio>
void main()
{
    char fname[256] = "C:\\sample_file.txt";
    FILE* f = _fsopen(fname, "r", _SH_DENYRD);
    if (!f)
    {
        printf_s("file doesn't exist\n");
        system("pause");
        exit(0);
    }
    int size = _filelength(_fileno(f));
    if (!size)
    {
        printf_s("file size is 0\n");
        system("pause");
        exit(0);
    }
    char* buffer = new char [size];
    fgets(buffer, size, f);
    fclose(f); 
    /*работа с buffer*/;
    delete [] buffer;
}
alexelev вне форума Ответить с цитированием
Старый 02.06.2013, 14:58   #5
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Можно и так))
Igor95 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамический массив под строку. Замкнутый круг. ilizard Помощь студентам 1 02.06.2013 16:30
Выделить память под динамический массив указателей vik24rus Общие вопросы C/C++ 5 15.04.2013 13:19
Освобождение памяти под динамический массив tsar_ Общие вопросы Delphi 7 24.12.2011 00:37
Как переделать под динамический двумерный массив? Kroleg C++ Builder 2 20.10.2011 13:36
Динамический массив - или всё таки не динамический? vedro-compota Общие вопросы C/C++ 30 10.12.2010 23:22