Удаление пробелов из MMAP в C - PullRequest
2 голосов
/ 07 декабря 2011

Я пытаюсь удалить пробелы, содержащиеся в файле, и после того, как я прочитал его с помощью mmap, я продолжаю, удаляя пробелы с помощью цикла for и перебирая следующий указатель на текущий индекс, но это не кажется работать. Вот мой код для иллюстрации:

static unsigned long get_size_by_fd(int fd) {
    struct stat statbuf;
    if(fstat(fd, &statbuf) < 0) exit(-1);
    return statbuf.st_size;
}

fd = open("/home/text.txt", O_RDONLY);
file_size = get_size_by_fd(fd);
fb = mmap(0, file_size, PROT_READ || PROT_WRITE, MAP_SHARED, fd, 0);

for (i = 0; i<file_size; i++) {
    if (fb[i] == 0x20) {
        fb[i] = fb[i++];
    }
}

Ответы [ 3 ]

2 голосов
/ 07 декабря 2011

В назначении fb[i] = fb[i++]; нет точки последовательности, поэтому вы получите неопределенные результаты. Лучше написать это просто:

if (fb[i] == 0x20 && i + 1 < file_size))
{
    fb[i] = fb[i + 1];
    ++i;
}

Я также добавил дополнительную проверку границ (учтите, когда в конце есть пробелы).

Обратите внимание, что ваша программа делает предположения о кодировке файла.

0 голосов
/ 27 сентября 2012

Вы также должны открыть дескриптор файла для чтения и записи!

0 голосов
/ 07 декабря 2011

Если вы хотите удалить все пробелы, вы должны использовать два индекса:

for (i = 0, j = 0; i<file_size; i++) {
    if (fb[i] != 0x20) {
        fb[j++] = fb[i];
    }
}

После того, как цикл завершен, j сообщает вам новый размер, который вы должны каким-то образом применять (возможно, с * 1005).* в файле).

...