【问题标题】:Assersion error using f_printf of fatfs, but f_write works fine使用 fatfs 的 fprintf 断言错误,但 f_write 工作正常
【发布时间】:2020-06-04 00:02:51
【问题描述】:

我有一小段代码可以打开一个文件,读取一个数字,添加一个数字并将其写回文件。 当我使用f_write 时它工作正常,但f_open 返回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_printf: When the string was written successfuly, it returns number of character encoding units written to the file. When the function failed due to disk full or any error, an EOF (-1) will be returned.

标签: c stm32 fatfs


【解决方案1】:

我相信f_write 确实会返回一个FRESULT,但f_printf 会返回一个int,表示写入的字符数。因此,检查F_OK 作为返回没有意义。您需要根据输入格式字符串进行断言,

编辑:根据@KamilCuk 评论,EOF (-1) 将在失败时返回,因此对此进行测试。

【讨论】:

  • 你是绝对正确的。文档中明确提到了,不知道我为什么要检查FRESULT
猜你喜欢
  • 2016-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2018-04-15
  • 1970-01-01
  • 2012-04-07
相关资源
最近更新 更多