使用 fatfs 的 f_printf 断言错误,但 f_write 工作正常
Assersion error using f_printf of fatfs, but f_write works fine
我有一小段代码可以打开一个文件,读取一个数字,加一个然后写回文件。
当我使用 f_write
时它工作正常,但是 f_open
returns FR_INT_ERR
。
我使用的是 R0.12c 版本。
产生错误的代码:
FIL indexFile;
char chars[10] = {0};
uint16_t indexNumber = 0;
FRESULT fr;
fr = f_open(&indexFile, INDEX_NAME, FA_READ | FA_WRITE | FA_OPEN_EXISTING);
fr = f_read(&indexFile, &chars, 10, &br);
indexNumber = atoi(chars);
fr = f_lseek(&indexFile, 0);
fr = f_printf(&indexFile, "%d", indexNumber+1); // produces assertion error
if (fr != FR_OK) printf("Something went wrong");
但如果我将 fr = f_printf(&indexFile, "%d", indexNumber+1);
更改为以下内容,它不会抱怨:
char stringBuffer[5];
sprintf(stringBuffer, "%d", indexNumber+1);
UINT bw;
fr = f_write(&indexFile, stringBuffer, strlen(stringBuffer), &bw);
if (fr != FR_OK || strlen(stringBuffer) != bw) printf("something went wrong");
虽然我可以继续使用第二种方法,但我是那种需要了解问题所在的人。
顺便说一句:我正在使用 STM32
我相信 f_write
确实 return 一个 FRESULT
但 f_printf
将 return 一个 int
指示字符数书面。因此,将 F_OK
检查为 return 没有意义。您需要根据输入格式字符串进行断言,
编辑:根据@KamilCuk 的评论,EOF (-1) 将在失败时 returned,因此请测试一下。
我有一小段代码可以打开一个文件,读取一个数字,加一个然后写回文件。
当我使用 f_write
时它工作正常,但是 f_open
returns FR_INT_ERR
。
我使用的是 R0.12c 版本。
产生错误的代码:
FIL indexFile;
char chars[10] = {0};
uint16_t indexNumber = 0;
FRESULT fr;
fr = f_open(&indexFile, INDEX_NAME, FA_READ | FA_WRITE | FA_OPEN_EXISTING);
fr = f_read(&indexFile, &chars, 10, &br);
indexNumber = atoi(chars);
fr = f_lseek(&indexFile, 0);
fr = f_printf(&indexFile, "%d", indexNumber+1); // produces assertion error
if (fr != FR_OK) printf("Something went wrong");
但如果我将 fr = f_printf(&indexFile, "%d", indexNumber+1);
更改为以下内容,它不会抱怨:
char stringBuffer[5];
sprintf(stringBuffer, "%d", indexNumber+1);
UINT bw;
fr = f_write(&indexFile, stringBuffer, strlen(stringBuffer), &bw);
if (fr != FR_OK || strlen(stringBuffer) != bw) printf("something went wrong");
虽然我可以继续使用第二种方法,但我是那种需要了解问题所在的人。
顺便说一句:我正在使用 STM32
我相信 f_write
确实 return 一个 FRESULT
但 f_printf
将 return 一个 int
指示字符数书面。因此,将 F_OK
检查为 return 没有意义。您需要根据输入格式字符串进行断言,
编辑:根据@KamilCuk 的评论,EOF (-1) 将在失败时 returned,因此请测试一下。