RT-Thread 默认是没有使能f_gets函数的,再ffconf.h中可以对其进行设置。
将其中的宏定义改为
#define _USE_STRFUNC 1
/* This option switches string functions, f_gets(), f_putc(), f_puts() and
/ f_printf().
/
/ 0: Disable string functions.
/ 1: Enable without LF-CRLF conversion.
/ 2: Enable with LF-CRLF conversion. */
测试代码如下:
static void readwrite_sample(void)
{
char s[100] = "asdf\nqwer\r\nzxcv\rasdf\nqwer\r\nzxcv\r123\r\n";
char buffer[128];
FIL *fp = RT_NULL;
size_t size = 0;
int bw;
fp = rt_malloc(sizeof(FIL));
f_open(fp, "/text.txt", FA_OPEN_ALWAYS | FA_WRITE);
f_write(fp, s, strlen(s), &bw);
f_close(fp);
f_open(fp, "/text.txt", FA_OPEN_EXISTING | FA_READ);
size = f_size(fp);
rt_kprintf("file size=>%d\n", size);
while (1)
{
int ret = f_gets(buffer, 128, fp);
if (ret == RT_NULL)
break;
rt_kprintf("ret=>%x,size=>%d,buff=>%s\n", ret, size, buffer);
rt_thread_mdelay(100);
}
f_close(fp);
rt_kprintf("...\n");
rt_free(fp);
}
显示结果如下:
msh />readwrite_sample
file size=>37
ret=>20008ed0,size=>37,buff=>asdf
ret=>20008ed0,size=>37,buff=>qwer
asdf>20008ed0,size=>37,buff=>zxcv
ret=>20008ed0,size=>37,buff=>qwer
123=>20008ed0,size=>37,buff=>zxcv
...
可以发现,\r\n和\n都会被认作行结束标志,但/r会在下一行的开头进行输出(这里可能是xshell的显示支持原因)。
另外关于对函数的使用介绍,可以参考另一篇博文:FATFS 初学之 f_gets/ f_putc/ f_puts/ f_printf