使用 FatFs 打开文件时数据被覆盖
Data overwritten when opening file using 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。
您需要设置打开模式,使其附加到文件而不是在开头写入:
来自f_open
FA_OPEN_APPEND
Same as FA_OPEN_ALWAYS
except read/write pointer is set end of the file.
当你用这个打开文件时:
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
将执行的操作,但保持文件打开。来自文档:
This is suitable for the applications that open files for a long time in write mode, such as data logger. Performing f_sync function of periodic or immediataly after f_write function can minimize the risk of data loss due to a sudden blackout or an unintentional media removal.
这几乎涵盖了我能想到的所有情况,了解为什么您可能会反复打开和关闭文件以附加数据,因此这可能是解决您问题的更好方法。
如果我关闭一个文件然后重新打开它,我无法在重新打开它后向它写入更多数据,但如果我保持它打开,我可以写任意多行,然后在写完后关闭它。 请参见下面的示例。谢谢
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。
您需要设置打开模式,使其附加到文件而不是在开头写入:
来自f_open
FA_OPEN_APPEND
Same asFA_OPEN_ALWAYS
except read/write pointer is set end of the file.
当你用这个打开文件时:
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
将执行的操作,但保持文件打开。来自文档:
This is suitable for the applications that open files for a long time in write mode, such as data logger. Performing f_sync function of periodic or immediataly after f_write function can minimize the risk of data loss due to a sudden blackout or an unintentional media removal.
这几乎涵盖了我能想到的所有情况,了解为什么您可能会反复打开和关闭文件以附加数据,因此这可能是解决您问题的更好方法。