Добавить элемент в файл перед последней строкой в ​​c - PullRequest
1 голос
/ 16 июля 2010

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

ITEM1
ITEM2
06/07/2010 10: 20: 22 * ​​1006 * // строка нижнего колонтитула

Элемент «»Должен добавляться в существующий файл до строки нижнего колонтитула, и нижний колонтитул должен обновляться с новым значением.У меня есть переменные «item» и «time», которые содержат соответствующие значения в виде строки.

После добавления нового элемента (ITEM3) файл выглядит следующим образом:

ITEM1
ПУНКТ 2
ПУНКТ 3
07/07/2010 17: 20: 12 // измененный нижний колонтитул

Помогите мне добиться этого.

Ответы [ 5 ]

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

Мое решение будет, fopen с режимом "r +" (чтение и запись).fseek в обратном направлении от конца, значение длины буфера и его заполнение (снова поместив курсор в конец), поиск в буфере в обратном порядке последней последней строки (если ее нет, ищите еще дальше и повторите), как только онанайден (или вы нажали начало файла), найдите эту позицию в файле (ваше чтение поместило его где-то в другом месте) и запишите новый элемент, за которым следует новая строка, за которой следует новый нижний колонтитул.Закройте файл и truncate до нужного размера.

HTH.

РЕДАКТИРОВАТЬ:
Если размер нижнего колонтитула всегда будет одинаковым, я быопределенно пойти на решение Николая.

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

Так как длина строки нижнего колонтитула является статической длиной ...

Найдите начало строки нижнего колонтитула, запишите новый элемент поверх нее, а затем начертанную строку, затем запишите новый нижний колонтитул.

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

1 голос
/ 16 июля 2010

на похожую заметку; Всякий раз, когда вы изменяете файл, метаданные файла изменяются, чтобы обновить точное время последней записи файла. Вы всегда можете запросить эти данные с помощью GetFileTime () в Windows.

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

Это легко. Вам нужно только обрезать последнюю строку.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NEWLINE "new line to append\n"

int main() {
  FILE *file;
  char *line = NULL;
  size_t previous_line_offset = 0, line_offset = 0;
  time_t time_signature;

  // open data file
  if((file = fopen("data.txt", "rw+")) == NULL) {
    puts("ERROR: Cannot open the file");
    return 1;
  }

  // find last line offset
  while(!feof(file)) {
    int n;
    previous_line_offset = line_offset;
    line_offset = ftell(file);
    getline(&line, &n, file); // NOTE getline is a GNU extension
  }

  // append new line
  fseek(file, previous_line_offset, SEEK_SET);
  fputs(NEWLINE, file);

  // apend signature
  time(&time_signature);
  fprintf(file, "%s", asctime(localtime(&time_signature)));

  // free resources
  fclose(file);
  if(line)
    free(line);

  // voila!
  return 0;
}
0 голосов
/ 16 июля 2010

Простой (но не очень эффективный) алгоритм может выглядеть так:

string content = "";
string line = "";

// Append every but the last line to content
while(!eof(file))
{
    content += line;
    line = readline(file);
}

content += getNewItem();
content += generateFooter();

save(content);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...