Есть ли портативный (Windows, Linux, MacOS, Android) способ открытия файлов с отображением памяти? - PullRequest
0 голосов
/ 26 мая 2020

У меня есть приложение, которое записывает относительно большие файлы (по сравнению с его вводом, а не с памятью системы) и тратит примерно 80% своего времени просто на запись вывода. Приложение также поддерживает параметр «-diff», который указывает ему не записывать файлы, а вместо этого сравнивать то, что оно будет записывать, с тем, что уже есть, и генерировать сообщение об ошибке, если есть разница. реализация опции -diff. Я открываю файл и использую fget c, чтобы читать его символ за символом, чтобы сравнивать символ за символом с тем, что я обычно пишу. Что-то вроде этого псевдокода (хотя реальный код намного сложнее, поскольку у меня есть разные вещи, в которых я хочу игнорировать различия:

void my_fputs(new_text, file_to_diff_to) {
   for (c = *new_text; *c; ++c) {
      x = fgetc(file_to_diff_to);
      if (c != x) generated_error_message();
      }
}

Мой профилирование показывает, что я большую часть времени провожу в fget c. Я полагаю, что имею дело с буферизацией. Я бы предпочел переносимый код, который выглядел бы так.

void my_fputs(new_text, file_to_diff_to) {
   for (c = *new_text; *c; ++c) {
      x = *file_to_diff_to;       
      if (c != x) generated_error_message();
      ++file_to_diff_to;
      }
}

Есть ли что-то относительно портативное, что позволило бы мне это сделать? Если это важно, я чтение файлов в двоичном (не текстовом) режиме. Проблемы cr / lf решаю сам.

1 Ответ

1 голос
/ 30 мая 2020

mmap довольно портативен и даже работает на Windows (я пробовал его с MinGW-w64), используя порт Windows из: https://github.com/witwall/mman-win32/

...