Вставка данных в файл в c - PullRequest
4 голосов
/ 16 июля 2010

Мне нужно добавить строку перед байтом 45 th в существующем файле. Я попытался использовать fseek, как показано ниже.

int main()
{
    FILE *fp;
    char str[] = "test";     

    fp = fopen(FILEPATH,"a");
    fseek(fp,-45, SEEK_END);                
    fprintf(fp,"%s",str);
    fclose(fp);     
    return(0);
}

Я ожидал, что этот код добавит «test» перед 45 th char от EOF, вместо этого он просто добавляет «test» к EOF.

Пожалуйста, помогите мне найти решение.

Это продолжение моего предыдущего вопроса
Добавить элемент в файл перед последней строкой в ​​c

Ответы [ 3 ]

11 голосов
/ 16 июля 2010

Откройте его в режиме r + (если он уже существует) или + (если он не существует и вы хотите его создать). Поскольку вы ищете 45 байтов до конца файла, я предполагаю, что он уже существует.

fp = fopen(FILEPATH,"r+");

Остальная часть вашего кода в порядке. Также обратите внимание, что это не будет вставлять текст, но будет перезаписывать все, что в данный момент находится в этой позиции в файле.

т.е. если ваш файл выглядит так:

xxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxx

Тогда после запуска этого кода он будет выглядеть так:

xxxxxxxtestxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxx

Если вы действительно хотите вставить, а не перезаписать, вам нужно прочитать весь текст из SEEK_END-45 в EOF в память, записать test , а затем записать текст обратно

3 голосов
/ 16 июля 2010

Не открывайте его как append (a), если вы планируете писать на произвольных позициях; это заставит все записи в конец файла. Вы можете использовать r+ для чтения или записи в любом месте.

0 голосов
/ 16 июля 2010

Чтобы избежать специфичных для платформы конфигураций, всегда явно указывайте двоичный или текстовый режим в вызове fopen ().

Это сэкономит вам часы отчаяния, если вы однажды перенесете свой код.

...