Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Фатал еррор в коде http://www.cyberforum.ru/cpp-beginners/thread133657.html
мне нада исправить данный код для корректной работы в визуал си++ "ошибка заключается в том что тут нада отсчет начать с 0, а не с 1", эти слова препода мне ни о чем не говорят. help задача...
ЗАПРЕТ на ввод Б У К В Ы ... ... ... C++
Господа Уважаемые Программисты, если я объявляю переменную х как символьную,........... то каким образом мне надо поставить условие, .............................. чтобы при вводе в качестве этой...
C++ Разработать функцию определения среднего арифметического коэффициентов многочлена
Помогите пожалуйста по учебе. Задание: Разработать и реализовать функцию определения среднего арифметического коэффициентов многочлена на языке Си для работы с многочленом (на фото)...
C++ Копирование строк Всем доброго времени суток. У меня такой вопрос как можно копировать строка в строку не с заменой, а с добавлением в строку. например есть что-то вроде : char A = "DFGH"; char B = "FFFF"; ... http://www.cyberforum.ru/cpp-beginners/thread133644.html
C++ Сортировка вектора http://www.cyberforum.ru/cpp-beginners/thread133640.html
Нужно отсорировать вектор в порядке убывания при помощи поинтеров. Тоесть доступ к элементам вектора осушествляется через поинтеры.
сортировка стека или очереди!!! C++
вот код программы: пишет постоянно ошибка сегментации. или просто не работает. n=kol_vo; w=sposob; last=n;
Упорядочить строки матрицы, содержащие нули, в порядке возрастания их количества C++
Дана матрица. Упорядочить ее строки, содержащие нули, в порядке возрастания их количества. помогите плизз)
C++ Подсчитать наибольшее количество идущих подряд пробелов дана строка. подсчитать наибольшее количество идущих подряд пробелов http://www.cyberforum.ru/cpp-beginners/thread133616.html
C++ Структуры и файлы http://www.cyberforum.ru/cpp-beginners/thread133612.html
Помогите, пожалуйста, написать следующую программу: Структура записей файла: шифр темы; шифр книги; фамилия, имя, отчество автора; название книги; издательство; год издания. Ввести с экрана фамилию,...
C++ Вычесление интегралов методом правых прямоугольников Помагите пожалуйста решить задачку в С++(или хотябы помочь как делать), а звучит она так: Нужно вычислить приближённое значение интеграла x^2*cos(x/4), пределы интегрирования этого интеграла a=2(под... http://www.cyberforum.ru/cpp-beginners/thread133609.html
COKPOWEHEU
1328 / 960 / 221
Регистрация: 09.09.2017
Сообщений: 3,965
22.10.2018, 16:23 0

Чтение из файла с конца

22.10.2018, 16:23. Просмотров 9067. Ответов 14
Метки (Все метки)

Ответ

odip, Еще проще: отображаем файл на память и отображаем сразу там:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <inttypes.h>
#include <unistd.h>
#include <fcntl.h>
 
int main() {
  int fd;
  uint8_t *mem=NULL;
  size_t size, size2, i;
  
//отображаем файл на память
  fd = open("a.txt", O_RDWR, S_IRUSR);
  if(fd < 0)return -1;
  size = lseek(fd, 0, SEEK_END);
  mem = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  if(mem == NULL){close(fd); return -2;}
  
//переворачиваем
  size2 = size/2;
  uint8_t temp;
  for(i=0; i<size2; i++){
    temp=mem[i]; mem[i]=mem[size-i-1]; mem[size-i-1]=temp;
  }
  
//закрываем
  munmap(mem, size);
  close(fd);
}
Добавлено через 6 минут
Вариант для мазохистов (WinAPI)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <windows.h>
#include <inttypes.h>
 
int main() {
  HANDLE fd, fm;
  uint8_t *mem=NULL;
  size_t size, size2, i;
  
  fd = CreateFile("a.txt",
                  GENERIC_READ | GENERIC_WRITE,
                  FILE_SHARE_READ | FILE_SHARE_WRITE,
                  NULL,
                  OPEN_EXISTING,
                  FILE_ATTRIBUTE_NORMAL,
                  NULL);
  if(fd == INVALID_HANDLE_VALUE)return -1;
  if(fd == NULL)return -2;
  size = SetFilePointer(fd, 0, NULL, FILE_END);
  fm = CreateFileMapping(fd, NULL, PAGE_READWRITE, 0, size, NULL);
  if(fm == NULL){
    CloseHandle(fm);
    return -3;
  }
  mem = MapViewOfFile(fm, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, size);
  if(mem == NULL){
    CloseHandle(fm);
    CloseHandle(fd);
    return -4;
  }
  
  size2 = size/2;
  uint8_t temp;
  for(i=0; i<size2; i++){
    temp=mem[i]; mem[i]=mem[size-i-1]; mem[size-i-1]=temp;
  }
  
  UnmapViewOfFile(mem);
  CloseHandle(fm);
  CloseHandle(fd);
}
Добавлено через 2 часа 38 минут
Результаты тестирования простейшего решения в лоб (можно было бы поиграться с блочным чтением, но сейчас неохота) для трех вариантов: через потоки (open/read/write), через отображение на общую память (флаг MAP_SHARED) и через отображение на локальную память (флаг MAP_PRIVATE).
.
Файл ~600 МБ
потоки: 0.78 сек
shared: 0.56
private: 0.69
.
Файл ~4 ГБ
потоки: 17 сек
shared: 31
private: 21
.
В случае работы через потоки приходилось создавать массив размером с файл, то есть для сверхбольших файлов этот способ уже не подойдет. На маленьких файлах выигрывает отображение на память, вероятно за счет меньшего количества копирования туда-сюда. На крупных же лучше работает последовательное копирование в локальный буфер, а потом - не менее последовательное обратно. Произвольный же доступ вводит систему в ступор.

Вернуться к обсуждению:
Чтение из файла с конца
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.10.2018, 16:23
Готовые ответы и решения:

Чтение файла с несколькими знаками конца файла
В файле несколько раз встречается ноль, и ни как не получается прочитать его полностью. Как можно...

Чтение запросов до конца файла
Доброго времени суток, Помогите начинающему...Имеется задача.Само условие говорить не буду(не...

Чтение начиная с конца файла
Всем добрый вечер! Программа создает самопальный класс список как в STL и пишет/ читает с файла ...

Чтение файла с n строки и до конца файла
как сделать так чтобы писало не с начала файла а например с середины и до конца? fstream...

Чтение чисел из файла до конца строки
Есть один файл. В первой строке написано общее количество последующих строк, во всех остальных —...

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