FATFS 初学之 f_gets/ f_putc/ f_puts/ f_printf

详见:嵌入式大讲堂

f_gets:

 1 /*-----------------------------------------------------------------------*/
 2 /* Get a string from the file                                            */
 3 /*-----------------------------------------------------------------------*/
 4 TCHAR* f_gets 
 5     TCHAR* buff,    /* Pointer to the string buffer to read */
 6     int len,        /* Size of string buffer characters) */
 7     FIL* fil        /* Pointer to the file object */
 8 )
 9 {
10     int n = 0;
11     TCHAR c, *p = buff;
12     BYTE s[2];
13     UINT rc;
14 
15 
16     while n < len - 1) {            /* Read bytes until buffer gets filled */
17         f_readfil, s, 1, &rc);
18         if rc != 1) break;            /* Break on EOF or error */
19         c = s[0];
20 #if _LFN_UNICODE                    /* Read a character in UTF-8 encoding */
21         if c >= 0x80) {
22             if c < 0xC0) continue;    /* Skip stray trailer */
23             if c < 0xE0) {            /* Two-byte sequense */
24                 f_readfil, s, 1, &rc);
25                 if rc != 1) break;
26                 c = c & 0x1F) << 6) | s[0] & 0x3F);
27                 if c < 0x80) c = '?';
28             } else {
29                 if c < 0xF0) {        /* Three-byte sequense */
30                     f_readfil, s, 2, &rc);
31                     if rc != 2) break;
32                     c = c << 12) | s[0] & 0x3F) << 6) | s[1] & 0x3F);
33                     if c < 0x800) c = '?';
34                 } else {            /* Reject four-byte sequense */
35                     c = '?';
36                 }
37             }
38         }
39 #endif
40 #if _USE_STRFUNC >= 2
41         if c == '') continue;    /* Strip '' */
42 #endif
43         *p++ = c;
44         n++;
45         if c == '
') break;        /* Break on EOL */
46     }
47     *p = 0;
48     return n ? buff : 0;            /* When no data read eof or error), return with error. */
49 }

View Code

函数功能:f_gets从文件中读取一个字符串。

描述:

f_gets函数当_USE_STRFUNC == 1或者_USE_STRFUNC == 2时可用。如果_USE_STRFUNC == 2,文件中包含的”则被去除。
f_gets函数是f_read的一个封装函数。当读取到’
‘、文件结束或缓冲区被填冲了Size – 1个字符时,读操作结束。读取的字符串以”结束。当文件结束或读操作中发生了任何错误,f_gets)返回一个空字符串。可以使用宏f_eof)和f_error)检查EOF和错误状态。

f_putc:

 1 /*-----------------------------------------------------------------------*/
 2 /* Put a character to the file                                           */
 3 /*-----------------------------------------------------------------------*/
 4 int f_putc 
 5     TCHAR c,    /* A character to be output */
 6     FIL* fil    /* Pointer to the file object */
 7 )
 8 {
 9     UINT bw, btw;
10     BYTE s[3];
11 
12 
13 #if _USE_STRFUNC >= 2
14     if c == '
') f_putc '', fil);    /* LF -> CRLF conversion */
15 #endif
16 
17 #if _LFN_UNICODE    /* Write the character in UTF-8 encoding */
18     if c < 0x80) {            /* 7-bit */
19         s[0] = BYTE)c;
20         btw = 1;
21     } else {
22         if c < 0x800) {    /* 11-bit */
23             s[0] = BYTE)0xC0 | c >> 6));
24             s[1] = BYTE)0x80 | c & 0x3F));
25             btw = 2;
26         } else {            /* 16-bit */
27             s[0] = BYTE)0xE0 | c >> 12));
28             s[1] = BYTE)0x80 | c >> 6) & 0x3F));
29             s[2] = BYTE)0x80 | c & 0x3F));
30             btw = 3;
31         }
32     }
33 #else                /* Write the character without conversion */
34     s[0] = BYTE)c;
35     btw = 1;
36 #endif
37     f_writefil, s, btw, &bw);        /* Write the char to the file */
38     return bw == btw) ? 1 : EOF;    /* Return the result */
39 }

View Code

函数功能:f_putc函数向文件中写入一个字符。

描述:

f_putc函数当_FS_READONLY == 0)&&_USE_STRFUNC == 1 || _USE_STRFUNC == 2)时可用。当_USE_STRFUNC == 2时,字符’
‘被转换为”
“写入文件中。
f_putc函数是f_write的一个封装函数。

f_puts:

 1 /*-----------------------------------------------------------------------*/
 2 /* Put a string to the file                                              */
 3 /*-----------------------------------------------------------------------*/
 4 int f_puts 
 5     const TCHAR* str,    /* Pointer to the string to be output */
 6     FIL* fil            /* Pointer to the file object */
 7 )
 8 {
 9     int n;
10 
11 
12     for n = 0; *str; str++, n++) {
13         if f_putc*str, fil) == EOF) return EOF;
14     }
15     return n;
16 }

View Code

函数功能:f_puts函数向文件中写入一个字符串。

描述:

f_puts)当_FS_READONLY == 0)&&_USE_STRFUNC == 1 || _USE_STRFUNC == 2)时可用。当_USE_STRFUNC == 2时,字符串中的’
‘被转换为”
“写入文件中。
f_puts)是f_putc)的一个封装函数。

f_printf:

 1 /*-----------------------------------------------------------------------*/
 2 /* Put a formatted string to the file                                    */
 3 /*-----------------------------------------------------------------------*/
 4 int f_printf 
 5     FIL* fil,            /* Pointer to the file object */
 6     const TCHAR* str,    /* Pointer to the format string */
 7     ...                    /* Optional arguments... */
 8 )
 9 {
10     va_list arp;
11     BYTE f, r;
12     UINT i, j, w;
13     ULONG v;
14     TCHAR c, d, s[16], *p;
15     int res, chc, cc;
16 
17 
18     va_startarp, str);
19 
20     for cc = res = 0; cc != EOF; res += cc) {
21         c = *str++;
22         if c == 0) break;            /* End of string */
23         if c != '%') {                /* Non escape character */
24             cc = f_putcc, fil);
25             if cc != EOF) cc = 1;
26             continue;
27         }
28         w = f = 0;
29         c = *str++;
30         if c == '0') {                /* Flag: '0' padding */
31             f = 1; c = *str++;
32         } else {
33             if c == '-') {            /* Flag: left justified */
34                 f = 2; c = *str++;
35             }
36         }
37         while IsDigitc)) {        /* Precision */
38             w = w * 10 + c - '0';
39             c = *str++;
40         }
41         if c == 'l' || c == 'L') {    /* Prefix: Size is long int */
42             f |= 4; c = *str++;
43         }
44         if !c) break;
45         d = c;
46         if IsLowerd)) d -= 0x20;
47         switch d) {                /* Type is... */
48         case 'S' :                    /* String */
49             p = va_argarp, TCHAR*);
50             for j = 0; p[j]; j++) ;
51             chc = 0;
52             if !f & 2)) {
53                 while j++ < w) chc += cc = f_putc' ', fil));
54             }
55             chc += cc = f_putsp, fil));
56             while j++ < w) chc += cc = f_putc' ', fil));
57             if cc != EOF) cc = chc;
58             continue;
59         case 'C' :                    /* Character */
60             cc = f_putcTCHAR)va_argarp, int), fil); continue;
61         case 'B' :                    /* Binary */
62             r = 2; break;
63         case 'O' :                    /* Octal */
64             r = 8; break;
65         case 'D' :                    /* Signed decimal */
66         case 'U' :                    /* Unsigned decimal */
67             r = 10; break;
68         case 'X' :                    /* Hexdecimal */
69             r = 16; break;
70         default:                    /* Unknown type passthrough) */
71             cc = f_putcc, fil); continue;
72         }
73 
74         /* Get an argument and put it in numeral */
75         v = f & 4) ? ULONG)va_argarp, long) : d == 'D') ? ULONG)long)va_argarp, int) : ULONG)va_argarp, unsigned int));
76         if d == 'D' && v & 0x80000000)) {
77             v = 0 - v;
78             f |= 8;
79         }
80         i = 0;
81         do {
82             d = TCHAR)v % r); v /= r;
83             if d > 9) d += c == 'x') ? 0x27 : 0x07;
84             s[i++] = d + '0';
85         } while v && i < sizeofs) / sizeofs[0]));
86         if f & 8) s[i++] = '-';
87         j = i; d = f & 1) ? '0' : ' ';
88         res = 0;
89         while !f & 2) && j++ < w) res += cc = f_putcd, fil));
90         do res += cc = f_putcs[--i], fil)); whilei);
91         while j++ < w) res += cc = f_putc' ', fil));
92         if cc != EOF) cc = res;
93     }
94 
95     va_endarp);
96     return cc == EOF) ? cc : res;
97 }

View Code

函数功能:f_printf函数向文件中写入一个格式化字符串。

描述:

f_printf函数当_FS_READONLY == 0)&&_USE_STRFUNC == 1 || _USE_STRFUNC == 2)时可用。当_USE_STRFUNC == 2时,包含在格式化字符串中的’
‘将被转换成”
“写入文件中。

f_printf函数是f_putc和f_puts的一个封装函数。

例:

 1 f_getsbuf, NUM, &fil);            // 从文件中读取一个字符串的前 NUM个字符
 2 f_putcch, &fil);                // 向文件中写入一个字符
 3 f_putschar *)buffer, &fil);    // 向文件内写入一个字符串
 4 
 5 f_printf&fil, "%6d", -200);         /* "  -200" */
 6 f_printf&fil, "%02u", 5);           /* "05" */
 7 f_printf&fil, "%ld", 12345678L);    /* "12345678" */
 8 f_printf&fil, "%08lX", 1194684UL);  /* "00123ABC" */
 9 f_printf&fil, "%s", "String");      /* "String" */
10 f_printf&fil, "%c", 'a');           /* "a" */

View Code

Published by

风君子

独自遨游何稽首 揭天掀地慰生平