Данные перезаписываются при открытии файла с использованием FatFs

Если я закрою файл и затем снова открою его, я не смогу записать в него больше данных после его открытия, но если я оставлю его открытым, я могу написать столько строк, сколько захочу, а затем закрою его, когда закончу писать. Смотрите пример ниже. Благодарю.

if (f_mount(&FatFs, "", 1) == FR_OK) {
      f_mkdir ("TEST");

      count = 0;
      while(count < 200){

          if(f_open(&fil, "TEST/test.txt", FA_OPEN_ALWAYS | FA_WRITE) != FR_OK){
              break;
          }
          else{
              sprintf(array,"This is file entry number: %d\r\n",count);
              f_puts(array, &fil);
              if(f_close(&fil) != FR_OK){
                  break;
              }
          }
          count++;
      }
      f_mount(0, "", 1);
}

Он будет считать до максимального значения, но будет записывать только последнюю запись, которая равна 199.

1 ответ

Решение

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

От f_open

FA_OPEN_APPEND Такой же как FA_OPEN_ALWAYS кроме указателя чтения / записи устанавливается конец файла.

Когда вы открываете файл с этим:

f_open(&fil, "TEST/test.txt", FA_OPEN_ALWAYS | FA_WRITE);

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

f_puts(array, &fil);

Вы перезаписываете предыдущие данные в файле.

Если вы измените свой открытый на:

f_open(&fil, "TEST/test.txt", FA_OPEN_APPEND | FA_WRITE);

тогда вы должны получить желаемое поведение. Однако есть исключение, и каждый раз, когда вы запускаете это, вы продолжаете добавлять файл. Если это нежелательно, вам может понадобиться сначала удалить файл или сначала открыть его с помощью FA_OPEN_ALWAYS а затем заново открывать каждый проход с FA_OPEN_APPEND,


В зависимости от того, что вы пытаетесь сделать, вы должны взглянуть на f_sync, который выполнит все очистки и пишет, что f_close будет выполнять, но держит файл открытым. Из документации:

Это подходит для приложений, которые долго открывают файлы в режиме записи, таких как регистратор данных. Выполнение функции f_sync периодического или немедленного действия после функции f_write может минимизировать риск потери данных из-за внезапного отключения или непреднамеренного удаления носителя.

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

Другие вопросы по тегам