Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Козырь
39 / 38 / 2
Регистрация: 11.05.2010
Сообщений: 141
#1

Задан файл из целых чисел со знаком, разделенных пробелом. Произвести чтение этих чисел в обратном порядке, не читая предыдущие. - C++

16.02.2014, 00:44. Просмотров 618. Ответов 11
Метки нет (Все метки)

Есть множество задач анализа данных, записанных в файле, которые можно решить за "линию", не обязательно, сохраняя данные в оперативную память, если бы они поступали "с конца". А прямой анализ занимал бы полином степени повыше.

Читать файл с конца- это конечно утопия, но компьютер способен на многое.

Я нахожусь в поиске стандартных функций, которые реализовывали бы это, возможно, кто-нибудь знает такие?

Если не найду подобные, то посмотрю, на сколько будет оправдана собственная реализация данных функций.


псевдо ТЗ:
Задан файл из целых чисел со знаком, разделенных пробелом. Произвести чтение этих чисел в обратном порядке, не читая предыдущие.

Добавлено через 8 минут
А возможен другой ход рассуждений- если можно решить задачу за "линию" в обратном порядке, не резервируя память под данные, то можно проделать тоже самое в прямом порядке поступления данных. Опять же данный подход у меня на стадии развития. Сложно доказать это в общем виде.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.02.2014, 00:44     Задан файл из целых чисел со знаком, разделенных пробелом. Произвести чтение этих чисел в обратном порядке, не читая предыдущие.
Посмотрите здесь:

Программа для записи в файл чисел в обратном порядке C++
Вывести на экран последовательность целых чисел в обратном порядке C++
Дан массив целых чисел. Записать его элементы в обратном порядке. C++
C++ Напечатать в одну строку пятьдесят первых натуральных чисел разделенных запятой с пробелом
C++ написать программу,которая считает 10 чисел из файла 1.txt и запишет в новый файл максимальное из этих чисел.
C++ Вывести на экран: кубы всех целых чисел из диапазона от А до В (А В) в обратном порядке;
Считывание из файла чисел, разделенных пробелом, в массив C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Enotniy
96 / 95 / 14
Регистрация: 15.01.2014
Сообщений: 283
16.02.2014, 00:45     Задан файл из целых чисел со знаком, разделенных пробелом. Произвести чтение этих чисел в обратном порядке, не читая предыдущие. #2
Козырь, На ум приходит только самостоятельно передвигать каретку считывания, но это будет считывание по 1 символу
Козырь
39 / 38 / 2
Регистрация: 11.05.2010
Сообщений: 141
16.02.2014, 00:48  [ТС]     Задан файл из целых чисел со знаком, разделенных пробелом. Произвести чтение этих чисел в обратном порядке, не читая предыдущие. #3
Цитата Сообщение от Enotniy Посмотреть сообщение
Козырь, На ум приходит только самостоятельно передвигать каретку считывания, но это будет считывание по 1 символу
Да, это решение даётся за 1 мин. в Google, а также на данном форуме.

Интересует вариант наиболее приближенный к работе функций семейства printf. Но и опять же его целесообразность, чтобы он не занимал на много больше чем чтение.
Enotniy
96 / 95 / 14
Регистрация: 15.01.2014
Сообщений: 283
16.02.2014, 00:48     Задан файл из целых чисел со знаком, разделенных пробелом. Произвести чтение этих чисел в обратном порядке, не читая предыдущие. #4
Козырь,
Цитата Сообщение от Козырь Посмотреть сообщение
если можно решить задачу за "линию" в обратном порядке, не резервируя память под данные, то можно проделать тоже самое в прямом порядке поступления данных
контр пример задачи - для последнего простого числа в массиве найти сколько было с ним взаимно простых до него. напрямую - надо сохранять, обратно - не надо
Козырь
39 / 38 / 2
Регистрация: 11.05.2010
Сообщений: 141
16.02.2014, 00:56  [ТС]     Задан файл из целых чисел со знаком, разделенных пробелом. Произвести чтение этих чисел в обратном порядке, не читая предыдущие. #5
Цитата Сообщение от Enotniy Посмотреть сообщение
контр пример задачи - для последнего простого числа в массиве найти сколько было с ним взаимно простых до него. напрямую - надо сохранять, обратно - не надо
Другой подход рассуждений вдребезги разбился)) Значит есть целесообразность- читать назад.
Somebody
2777 / 1591 / 142
Регистрация: 03.12.2007
Сообщений: 4,170
Завершенные тесты: 1
16.02.2014, 10:55     Задан файл из целых чисел со знаком, разделенных пробелом. Произвести чтение этих чисел в обратном порядке, не читая предыдущие. #6
Файл можно читать с конца кусками нужного размера. Если границы блоков данных неизвестны (например, файл текстовый), тогда в два прохода: сначала запоминаются все позиции, откуда читать (которые занимают намного меньше памяти, чем сами данные), потом уже всё читается с конца.
raccoonlove
Заблокирован
16.02.2014, 11:06     Задан файл из целых чисел со знаком, разделенных пробелом. Произвести чтение этих чисел в обратном порядке, не читая предыдущие. #7
Козырь, можно обрабатывать данные при помощи рекурсии, код получится компактным (хоть и изврат это, конечно).
Dmitriy_M
1337 / 1218 / 111
Регистрация: 20.03.2009
Сообщений: 4,350
Записей в блоге: 11
18.02.2014, 11:03     Задан файл из целых чисел со знаком, разделенных пробелом. Произвести чтение этих чисел в обратном порядке, не читая предыдущие. #8
Цитата Сообщение от Козырь Посмотреть сообщение
Задан файл из целых чисел со знаком, разделенных пробелом. Произвести чтение этих чисел в обратном порядке, не читая предыдущие.
[***]. Не забывайте, что HDD штука последовательная.
Nick Alte
Эксперт С++
1605 / 997 / 118
Регистрация: 27.09.2009
Сообщений: 1,923
Завершенные тесты: 1
18.02.2014, 16:34     Задан файл из целых чисел со знаком, разделенных пробелом. Произвести чтение этих чисел в обратном порядке, не читая предыдущие. #9
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Не забывайте, что HDD штука последовательная.
Ну начнём с того, что HDD всё же имеет произвольный доступ, хотя пишет-читает всё же блоками, а не отдельными байтами. Последовательная штука - это магнитная лента.
Вспомним также, что любая вменяемая операционная система буферизует операции с файлами, так что даже чтение по 1 байту в обратном порядке не станет катастрофической "затычкой" производительности.
Dmitriy_M
1337 / 1218 / 111
Регистрация: 20.03.2009
Сообщений: 4,350
Записей в блоге: 11
18.02.2014, 18:41     Задан файл из целых чисел со знаком, разделенных пробелом. Произвести чтение этих чисел в обратном порядке, не читая предыдущие. #10
Цитата Сообщение от Nick Alte Посмотреть сообщение
Последовательная штука - это магнитная лента.
И в ленте можно двигаться вперед-назад.
Цитата Сообщение от Nick Alte Посмотреть сообщение
хотя пишет-читает всё же блоками, а не отдельными байтами.
Только кластера обычно последовательно расположены на диске.
Цитата Сообщение от Nick Alte Посмотреть сообщение
Вспомним также, что любая вменяемая операционная система буферизует операции с файлами, так что даже чтение по 1 байту в обратном порядке не станет катастрофической "затычкой" производительности.
Прокатит на маленьких файлах, если загрузит в память.
Козырь
39 / 38 / 2
Регистрация: 11.05.2010
Сообщений: 141
18.02.2014, 21:14  [ТС]     Задан файл из целых чисел со знаком, разделенных пробелом. Произвести чтение этих чисел в обратном порядке, не читая предыдущие. #11
Ну что же, мои результаты меня совсем не радуют, но это результаты.

Функция, занимающаяся чтением.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int backread(FILE *f)
{
 char c;
 long s,sum=0,mn=1;
 s=ftell(f);
 while(c!=' ' && s!=0)
 {
  fseek(f,--s,0);
  c=fgetc(f);
  if(c=='-') sum=-sum;
  else if(c==' ') fseek(f,s,0);
  else sum=sum+(c-'0')*mn;
  mn*=10;
 }
 return sum;
}
По работе нареканий никаких(кроме того, что файлу не стоит оканчиваться пробелом ).

Но по скорости...
занимает 1.772000 сек.
C++
1
2
3
4
5
fseek(f,0,SEEK_END);
while(ftell(f)!=1)
{
    x=backread(f);
}
занимает 0.010000 сек.
C++
1
while(fscanf(f,"%d",&x)!=EOF);
Проверка выполнялась на файле из 30000 чисел в диапазоне -5000 до 5000.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2014, 10:41     Задан файл из целых чисел со знаком, разделенных пробелом. Произвести чтение этих чисел в обратном порядке, не читая предыдущие.
Еще ссылки по теме:

Создать файл действительных чисел и переписать его компоненты в обратном порядке C++
C++ Задан массив целых чисел K (n). Найти в нем минимальный kmin и максимальный kmax элементы. Вывести в порядке в
C++ Для всех целых чисел отрезка [A,B] получить числа, записанные теми же цифрами, но в обратном порядке
Дано 100 целых чисел (случайная последовательность). Распечатайте эти числа в обратном порядке по 6 чисел в с C++
Чтение чисел с плавающей точкой из файла, разделенных запятыми в переменные C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Nick Alte
Эксперт С++
1605 / 997 / 118
Регистрация: 27.09.2009
Сообщений: 1,923
Завершенные тесты: 1
19.02.2014, 10:41     Задан файл из целых чисел со знаком, разделенных пробелом. Произвести чтение этих чисел в обратном порядке, не читая предыдущие. #12
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
И в ленте можно двигаться вперед-назад.
Это не отменяет её последовательности. А вот в винчестере если головка на блоке 0, а надо прочитать блок 1000, головке не надо "пролетать" над всеми промежуточными блоками.
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Только кластера обычно последовательно расположены на диске.
Это уж как повезёт и в любом случае это не забота программиста.
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Прокатит на маленьких файлах, если загрузит в память.
"Прокатит" на файле любого размера, потому что OS будет загружать его в память блоками.
Yandex
Объявления
19.02.2014, 10:41     Задан файл из целых чисел со знаком, разделенных пробелом. Произвести чтение этих чисел в обратном порядке, не читая предыдущие.
Ответ Создать тему
Опции темы

Текущее время: 05:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru