2013-06-09 3 views
4

Мне нужно удалить последние n символов из файла с помощью C-кода. В кулаке я пытался использовать '\ b', но он возвращает ошибку сегментации. Я видел интересные ответы на похожие вопросы here и here, но я бы предпочел использовать функцию mmap для этого, если это возможно. Я знаю, что было бы проще обрезать файл, создав временный файл, и написание символов до temp до некоторого смещения исходного файла. Проблема в том, что я не понимаю, как использовать функцию mmap для этого, не могу видеть, какие параметры мне нужно передать этой функции, особенно address, length и offset. Из того, что я прочитал, я должен использовать MAP_SHARED в flags и PROT_READ|PROT_WRITE в protect.C Удалить последние n символов из файла

Определение функции говорит:

void * mmap (void *address, size_t length, int protect, int flags, int filedes, off_t offset) 

Вот моя главная:

int main(int argc, char * argv[]) 
{ 
    FILE * InputFile; 
    off_t position; 
     int charsToDelete; 

    if ((InputFile = fopen(argv[1],"r+")) == NULL) 
    { 
      printf("tdes: file not found: %s\n",argv[1]); 
    } 
    else 
    { 
       charsToDelete = 5; 
     fseeko(InputFile,-charsToDelete,SEEK_END); 
     position = ftello(InputFile); 
     printf("Pos: %d\n",(int)position); 
     int i; 
     //for(i = 0;i < charsToDelete;i++) 
     //{ 
     // putc(InputFile,'\b'); 
     //} 
    } 
    fclose(InputFile); 
    return 0; 
} 

ответ

4

Почему бы не использовать:

#include <unistd.h> 
    #include <sys/types.h> 

    int truncate(const char *path, off_t length); 
    int ftruncate(int fd, off_t length); 

, как, например:

charsToDelete = 5; 
    fseeko(InputFile,-charsToDelete,SEEK_END); 
    position = ftello(InputFile); 
    ftruncate(fileno(InputFile), position); 
+0

I Использовал 'ftruncate (fileno (InputFile), position);' как вы предлагали, и он отлично работал. Благодаря! – anairinac

+0

как бы вы удалили первые n символов? – momosxp

+0

Единственный способ (кроме специального назначения и более сложный метод mmap) удалить последние символы, записанные в файле (например, что делает BACKSPACE в окне терминала. ++ 1 –

3

Читать все но n байт из файла и записи во временный файл, закройте исходный файл, переименовать временный файл как оригинальный файл.

Или использовать, например, truncate или аналогичная функция, если у вас есть.


Кроме того, отказ открыть файл не должен быть, что это не может быть найден, Вы должны проверить errno на провал, чтобы увидеть, что ошибка. Использовать, например. strerror, чтобы получить строку для печати из кода ошибки.

+0

Может быть что-то вроде разрешения. –

+0

Поскольку я не могу получить доступ к имени файла в реальном коде, я использовал ftruncate. Благодарю. – anairinac

2

К сожалению, mmap не позволяет изменять размер базового файлового объекта.

Вместо этого, я бы рекомендовал просто усечь файл, использовать что-то вроде этого:

truncate(filename, new_length); 
+0

Я думал, что могу использовать 'mmap' для этого. В каких случаях использование этой функции может показаться хорошей идеей? Когда мне нужно сделать некоторый сдвиг символов в файле? Как при использовании 'memmove'? – anairinac

+1

, потому что 'mmap' отображает содержимое файла в память (вы можете использовать указатели с известным размером блока памяти), вы должны удалить сопоставление * до того, как * вы измените размер файла, записав в него больше данных или с помощью' truncate'. Если вы хотите быстро манипулировать содержимым файла, 'mmap' - хороший и быстрый метод. Но если вам нужно изменить размер файла, измените его заранее, а затем используйте 'mmap'. – mvp

Смежные вопросы