213 / 202 / 85
Регистрация: 09.05.2012
Сообщений: 494
|
||||||
1 | ||||||
Построчное чтение неопределенного количества чисел из файла07.10.2012, 23:02. Показов 2813. Ответов 10
Метки нет (Все метки)
Здраствуйте. У меня программа построчно читает числа из файла в масив. Потом выполняется сортировка этих чисел. И на конец запись отсорированого набора чисел в тот же файл. Но меня смущает тот факт, что приходится читать файл два раза: первый раз для определения количества чисел, второй раз для считывания самих чисел. Ибо считываю я в масивы, а для масива я выделяю память, а чтобы знать сколько ее нужно выделить мне нужно знать сколько в файле чисел. Использование realoc(); 16 тысяч раз, при чем, это в лучшем случае, вобще чисел может быть и 160 тысяч, тоже както выглядет не очень хотя, к винчестеру так же часто обращатся не многим лучше
Дайте пожалуйста совет как можно уменьшить нагрузку на винчестер, не дергая его по пустякам лишних 160к раз, ну или вобще какой нибудь совет Вот код моей программы:
0
|
07.10.2012, 23:02 | |
Ответы с готовыми решениями:
10
Построчное чтение чисел из файла и последующая запись в HashSet Построчное чтение целых чисел из текстового файла с занесением в массив для анализа Построчное чтение из файла построчное чтение файла |
213 / 202 / 85
Регистрация: 09.05.2012
Сообщений: 494
|
|
08.10.2012, 00:51 [ТС] | 3 |
угу спасибо попробую
0
|
213 / 202 / 85
Регистрация: 09.05.2012
Сообщений: 494
|
|
08.10.2012, 12:25 [ТС] | 5 |
Пардоньте, а разве это для текстовых файлов подойдет? мало того что там число может занимать далеко не 4 байта, или же наборот более 4 байт, так там же еще есть по два байта в каждой строчке на символ возврата каретки и переноса на новую строчку(если я не ошибаюсь в windows именно так). помоему, такой вариант явно не подойет
1
|
08.10.2012, 13:54 | 6 | |||||
Да, в этом случае нужно будет два раза пройтись.
Тогда вот эта конструкция будет быстрее и экономнее чем с fscanf().
1
|
Модератор
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
|
|
08.10.2012, 15:15 | 10 |
lowercase, если не хотите 100500 раз realloc() вызывать (что в общем правильно), посмотрите, как в C++ STL класс vector реализован. Основная идея - памяти под массив выделяется заранее с запасом. Если в процессе заполнения её (выделенной памяти) не хватает - выделяется ещё и снова с запасом. Алгоритм вычисления количества дополнительной памяти может быть самый разнообразный - можно тупо по 512 байт к примеру наращивать, можно таки отслеживать позицию в файле, чтобы по отношению её к длине файла и прочитанному количеству чисел примерно вычислять, сколько ещё в файле чисел может остаться. Ну а когда весь файл прочитан - ещё раз realloc() чтобы пустой хвост удалить, если он будет. Ещё вариант - читать числа в список, а не в массив. Профит - прочитать так заранее неизвестное количество данных из файла действительно легче. В минусе - накладные расходы памяти и более замороченная (хоть и не на много) сортировка. И кстати - а чем Вам при массиве стандартная qsort() не угодила?
2
|
213 / 202 / 85
Регистрация: 09.05.2012
Сообщений: 494
|
|
08.10.2012, 20:07 [ТС] | 11 |
спасибо за советы буду разбиратся.
чесно говоря я даже не знал что она есть да и для всеобщего развития, как говорится, непомешает попробовать самому я ж это, только начинающий сишник
0
|
08.10.2012, 20:07 | |
08.10.2012, 20:07 | |
Помогаю со студенческими работами здесь
11
Построчное чтение файла Построчное чтение из файла Построчное чтение из файла Построчное чтение из файла Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |