2016-09-18 97 views
1

Если я закрою файл, а затем снова его закрою, я не могу записать ему больше данных после его повторного открытия, но если я его открываю, я могу написать столько строк, сколько захочу, а затем закрыть его, когда Я заканчиваю писать. См. Пример ниже. Благодарю.Данные, которые были перезаписаны при открытии файла с использованием 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.

ответ

0

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

от 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 может свести к минимуму риск потери данных из-за внезапного затемнения или непреднамеренного удаления носителя.

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

+0

спасибо, но версия, которую я использую, не имеет этого FA_OPEN_APPEND. Я смог добиться того же самого с f_seek(). Спасибо за помощь. –

+0

@o_tech, мне кажется странным, что он не включает 'FA_OPEN_APPEND', так как это довольно распространенный режим для открытия файлов. Я рад, что вы смогли обойти ограничения. – rjp

+0

эти флаги он имеет: #define \t FA_READ \t \t \t \t 0x01 #define \t FA_WRITE \t \t \t 0x02 #define \t \t FA_OPEN_EXISTING 0x00 #define \t FA_CREATE_NEW \t \t 0x04 #define \t \t FA_CREATE_ALWAYS 0x08 # определение \t FA_OPEN_ALWAYS \t \t 0x10 #define _FA_MODIFIED \t \t 0x20 #define _FA_DIRTY \t \t \t 0x40 Я попытался использовать _FA_MODIFY, но он не работал –

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

  • Нет связанных вопросов^_^