10
You can map the file with mmap, apply bitwise operations on the mapped memory, and close it.
Alternatively, reading chunks into a buffer, applying the operation on the buffer, and writing out the buffer works too.
Here's an example (C, not C++; since everything but the error handlings is the same) that inverts all bits:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
int main(int argc, char* argv[]) {
if (argc != 2) {printf("Usage: %s file\n", argv[0]); exit(1);}
int fd = open(argv[1], O_RDWR);
if (fd == -1) {perror("Error opening file for writing"); exit(2);}
struct stat st;
if (fstat(fd, &st) == -1) {perror("Can't determine file size"); exit(3);}
char* file = mmap(NULL, st.st_size, PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);
if (file == MAP_FAILED) {
perror("Can't map file");
exit(4);
}
for (ssize_t i = 0;i < st.st_size;i++) {
/* Binary operation goes here.
If speed is an issue, you may want to do it on a 32 or 64 bit value at
once, and handle any remaining bytes in special code. */
file[i] = ~file[i];
}
munmap(file, st.st_size);
close(fd);
return 0;
}