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

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

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

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

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

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

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

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

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


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

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

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

Дано 100 целых чисел (случайная последовательность). Распечатайте эти числа в обратном порядке по 6 чисел в с - C++
Дано 100 целых чисел (случайная последовательность). Распечатайте эти числа в обратном порядке по 6 чисел в строке.

Дан файл целых чисел. айти среди этих чисел те, что больше за среднее арифметическое суммы всех элементов - C++
дано файл целых чисел A1,....,An, которые упорядочены за спаданием. Найти среди этих чисел те , что больше за среднее арифметическое...

Дан файл целых чисел которые упорядочены по убыванию. Среди этих чисел найти те что больше среднего арифметического суммы всех элементов - C++
Всем привет, можете доделать прогу, а то сортирует на оборот ( как сделать чтоб виводило числа больше среднего?) Дан файл целых чисел...

Вывести на экран последовательность целых чисел в обратном порядке - C++
Помогите) Задание: Вывести на экран : целые числа 10, 12, 14, ... , 60 в обратном порядкев столбик))( в С ++ для начинающих, напишите...

Задан массив K(m) попарно различных целых чисел. Получить все перестановки целых чисел - C++
Помогите пожалуйста с программой. Задан массив K(m) попарно различных целых чисел. Получить все перестановки целых чисел

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

Интересует вариант наиболее приближенный к работе функций семейства printf. Но и опять же его целесообразность, чтобы он не занимал на много больше чем чтение.
0
Enotniy
96 / 95 / 14
Регистрация: 15.01.2014
Сообщений: 283
16.02.2014, 00:48 #4
Козырь,
Цитата Сообщение от Козырь Посмотреть сообщение
если можно решить задачу за "линию" в обратном порядке, не резервируя память под данные, то можно проделать тоже самое в прямом порядке поступления данных
контр пример задачи - для последнего простого числа в массиве найти сколько было с ним взаимно простых до него. напрямую - надо сохранять, обратно - не надо
1
Козырь
39 / 38 / 2
Регистрация: 11.05.2010
Сообщений: 141
16.02.2014, 00:56  [ТС] #5
Цитата Сообщение от Enotniy Посмотреть сообщение
контр пример задачи - для последнего простого числа в массиве найти сколько было с ним взаимно простых до него. напрямую - надо сохранять, обратно - не надо
Другой подход рассуждений вдребезги разбился)) Значит есть целесообразность- читать назад.
0
Somebody
2789 / 1603 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 1
16.02.2014, 10:55 #6
Файл можно читать с конца кусками нужного размера. Если границы блоков данных неизвестны (например, файл текстовый), тогда в два прохода: сначала запоминаются все позиции, откуда читать (которые занимают намного меньше памяти, чем сами данные), потом уже всё читается с конца.
0
raccoonlove
Заблокирован
16.02.2014, 11:06 #7
Козырь, можно обрабатывать данные при помощи рекурсии, код получится компактным (хоть и изврат это, конечно).
0
Dmitriy_M
1349 / 1230 / 114
Регистрация: 20.03.2009
Сообщений: 4,420
Записей в блоге: 11
18.02.2014, 11:03 #8
Цитата Сообщение от Козырь Посмотреть сообщение
Задан файл из целых чисел со знаком, разделенных пробелом. Произвести чтение этих чисел в обратном порядке, не читая предыдущие.
[***]. Не забывайте, что HDD штука последовательная.
0
Nick Alte
Эксперт С++
1637 / 1009 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
18.02.2014, 16:34 #9
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Не забывайте, что HDD штука последовательная.
Ну начнём с того, что HDD всё же имеет произвольный доступ, хотя пишет-читает всё же блоками, а не отдельными байтами. Последовательная штука - это магнитная лента.
Вспомним также, что любая вменяемая операционная система буферизует операции с файлами, так что даже чтение по 1 байту в обратном порядке не станет катастрофической "затычкой" производительности.
0
Dmitriy_M
1349 / 1230 / 114
Регистрация: 20.03.2009
Сообщений: 4,420
Записей в блоге: 11
18.02.2014, 18:41 #10
Цитата Сообщение от Nick Alte Посмотреть сообщение
Последовательная штука - это магнитная лента.
И в ленте можно двигаться вперед-назад.
Цитата Сообщение от Nick Alte Посмотреть сообщение
хотя пишет-читает всё же блоками, а не отдельными байтами.
Только кластера обычно последовательно расположены на диске.
Цитата Сообщение от Nick Alte Посмотреть сообщение
Вспомним также, что любая вменяемая операционная система буферизует операции с файлами, так что даже чтение по 1 байту в обратном порядке не станет катастрофической "затычкой" производительности.
Прокатит на маленьких файлах, если загрузит в память.
0
Козырь
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.
0
Nick Alte
Эксперт С++
1637 / 1009 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
19.02.2014, 10:41 #12
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
И в ленте можно двигаться вперед-назад.
Это не отменяет её последовательности. А вот в винчестере если головка на блоке 0, а надо прочитать блок 1000, головке не надо "пролетать" над всеми промежуточными блоками.
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Только кластера обычно последовательно расположены на диске.
Это уж как повезёт и в любом случае это не забота программиста.
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Прокатит на маленьких файлах, если загрузит в память.
"Прокатит" на файле любого размера, потому что OS будет загружать его в память блоками.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2014, 10:41
Привет! Вот еще темы с ответами:

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

Вывести на экран: кубы всех целых чисел из диапазона от А до В (А В) в обратном порядке; - C++
Вывести на экран: кубы всех целых чисел из диапазона от А до В (А В) в обратном порядке;

Вывести на экран кубы всех целых чисел из диапазона от А до В в обратном порядке - C++
Вывести на экран кубы всех целых чисел из диапазона от А до В (А<В) в обратном порядке.

Дан массив целых чисел. Записать его элементы в обратном порядке. - C++
Доброго времени суток. Помогите, пожалуйста, в следующем. Дан массив целых чисел. Записать его элементы в обратном порядке. Что...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.02.2014, 10:41
Ответ Создать тему
Опции темы

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