xref: /nrf52832-nimble/rt-thread/examples/file/readwrite.c (revision 042d53a763ad75cb1465103098bb88c245d95138)
1 /*
2  * 代码清单:文件读写例子
3  *
4  * 这个例子演示了如何读写一个文件,特别是写的时候应该如何操作。
5  */
6 
7 #include <rtthread.h>
8 #include <dfs_posix.h> /* 当需要使用文件操作时,需要包含这个头文件 */
9 
10 #define TEST_FN		"/test.dat"
11 
12 /* 测试用的数据和缓冲 */
13 static char test_data[120], buffer[120];
14 
15 /* 文件读写测试 */
16 void readwrite(const char* filename)
17 {
18 	int fd;
19 	int index, length;
20 
21 	/* 只写 & 创建 打开 */
22 	fd = open(TEST_FN, O_WRONLY | O_CREAT | O_TRUNC, 0);
23 	if (fd < 0)
24 	{
25 		rt_kprintf("open file for write failed\n");
26 		return;
27 	}
28 
29 	/* 准备写入数据 */
30 	for (index = 0; index < sizeof(test_data); index ++)
31 	{
32 		test_data[index] = index + 27;
33 	}
34 
35 	/* 写入数据 */
36 	length = write(fd, test_data, sizeof(test_data));
37 	if (length != sizeof(test_data))
38 	{
39 		rt_kprintf("write data failed\n");
40 		close(fd);
41 		return;
42 	}
43 
44 	/* 关闭文件 */
45 	close(fd);
46 
47 	/* 只写并在末尾添加打开 */
48 	fd = open(TEST_FN, O_WRONLY | O_CREAT | O_APPEND, 0);
49 	if (fd < 0)
50 	{
51 		rt_kprintf("open file for append write failed\n");
52 		return;
53 	}
54 
55 	length = write(fd, test_data, sizeof(test_data));
56 	if (length != sizeof(test_data))
57 	{
58 		rt_kprintf("append write data failed\n");
59 		close(fd);
60 		return;
61 	}
62 	/* 关闭文件 */
63 	close(fd);
64 
65 	/* 只读打开进行数据校验 */
66 	fd = open(TEST_FN, O_RDONLY, 0);
67 	if (fd < 0)
68 	{
69 		rt_kprintf("check: open file for read failed\n");
70 		return;
71 	}
72 
73 	/* 读取数据(应该为第一次写入的数据) */
74 	length = read(fd, buffer, sizeof(buffer));
75 	if (length != sizeof(buffer))
76 	{
77 		rt_kprintf("check: read file failed\n");
78 		close(fd);
79 		return;
80 	}
81 
82 	/* 检查数据是否正确 */
83 	for (index = 0; index < sizeof(test_data); index ++)
84 	{
85 		if (test_data[index] != buffer[index])
86 		{
87 			rt_kprintf("check: check data failed at %d\n", index);
88 			close(fd);
89 			return;
90 		}
91 	}
92 
93 	/* 读取数据(应该为第二次写入的数据) */
94 	length = read(fd, buffer, sizeof(buffer));
95 	if (length != sizeof(buffer))
96 	{
97 		rt_kprintf("check: read file failed\n");
98 		close(fd);
99 		return;
100 	}
101 
102 	/* 检查数据是否正确 */
103 	for (index = 0; index < sizeof(test_data); index ++)
104 	{
105 		if (test_data[index] != buffer[index])
106 		{
107 			rt_kprintf("check: check data failed at %d\n", index);
108 			close(fd);
109 			return;
110 		}
111 	}
112 
113 	/* 检查数据完毕,关闭文件 */
114 	close(fd);
115 	/* 打印结果 */
116 	rt_kprintf("read/write done.\n");
117 }
118 
119 #ifdef RT_USING_FINSH
120 #include <finsh.h>
121 /* 输出函数到finsh shell命令行中 */
122 FINSH_FUNCTION_EXPORT(readwrite, perform file read and write test);
123 #endif
124