读写文件的操作是最平常不过的了,也是最最基础的知识了,这里主要是通过系统调用的方式来实现的,是自己学习过程中随便写的,以便做个记录,高手请飘过!

代码文件:file_opera.c

  1 /***********************************************************
2 功能说明:系统调用方式文件操作
3 author: linux.sir@qq.com
4
5 ***********************************************************/
6 #include <stdlib.h>
7 #include <unistd.h>
8 #include <sys/types.h>
9 #include <sys/stat.h>
10 #include <fcntl.h>
11 #include <errno.h>
12 #include <stdio.h>
13 #include <string.h>
14
15 #define BUF_SIZE 1024
16
17 /**********************************************************
18
19 方法功能:主方法
20
21 **********************************************************/
22 int main(int argc, char * argv[])
23 {
24 int fd;
25
26 if(argc<2)
27 {
28 printf("请输入文件名\n");
29 exit(1);
30
31 }
32
33 fd = openfile(argv[1]);
34
35 printf("open result fd --%d\n", fd);
36
37
38
39 int wd = writefile(fd);
40
41 int r = closefile(fd); //前面对些文件进行写操作,游标指向末尾,后面再进行读时,需要关掉一下,重新打开文件
42
43 fd = openfile(argv[1]);
44 int rd = readfile(fd);
45 r = closefile(fd);
46
47
48 char dest[]="/home/magc/workspace/0124/test.bak";
49
50 fd = openfile(argv[1]);
51 int dest_fd = openfile(dest);
52 copyfile(fd,dest_fd);
53
54 }
55 /**********************************************************
56
57 方法功能:系统调用 open方法
58
59 **********************************************************/
60 int openfile(const char *pfile)
61 {
62
63 int fd;
64 fd = open(pfile, O_CREAT|O_RDWR|O_APPEND, S_IRWXU);
65 if(fd==-1)
66 {
67 printf("open error :%m\n", errno);
68
69 }
70 return fd;
71
72
73 }
74 /**********************************************************
75
76 方法功能:系统调用 close()方法
77
78 **********************************************************/
79 int closefile(int fd)
80 {
81 int r = close(fd);
82 if(r == -1)
83 {
84 printf("close error for %m\n", errno);
85 exit(1);
86
87 }else
88 {
89 printf("close success !\n");
90
91 }
92
93 return r ;
94
95 }
96 int readfile(int fd)
97 {
98 char buf[512];
99
100 int len = read( fd, buf, 512);
101 if(len!=512)
102 {
103
104 printf("read failed for %m\n", errno);
105 // exit(-1);
106
107 }
108 printf("read result:%s\n", buf);
109
110
111 }
112 /**********************************************************
113
114 方法功能:文件写入 write()方法
115
116 **********************************************************/
117 int writefile(int fd)
118 {
119 char buf[] = "hello tianjin\n";
120 int len = write( fd, buf, strlen(buf));
121 if(len==-1)
122 {
123 printf("write error for %m\n", errno);
124
125 }
126 return len;
127
128
129 }
130
131 /**********************************************************
132
133 方法功能:文件复制功能(系统调用方式实现)
134 read()
135 write()
136 close()
137
138 **********************************************************/
139 int copyfile(int src_fd , int dest_fd )
140 {
141
142
143 char buf[BUF_SIZE];
144 int rlen;
145 int wlen;
146
147 while(rlen=read(src_fd,buf,BUF_SIZE)) //buf比较小,需要考虑持续读取内容
148 {
149 if(rlen>0)
150 {
151 wlen = write(dest_fd,buf, rlen);
152 if(wlen!=rlen)
153 {
154 printf("write error for %m\n", errno);
155 exit(-1);
156
157 }
158
159 }
160
161 }
162
163 printf("copy success !\n");
164
165
166 }



注意事项:

1)通过create()方法来创建文件的方法不提供使用,统一用Open方法来处理。

2)读写及权限可以写多项,用“|”来分隔即可。

3)注意理解文件描述符,它是有游标的,在第33行里,需要先关掉之前Write()方法用的文件描述符,后面再次打开一下再进行读内容。

4)注意理解用Char数组来作为缓冲区。

5)通过系统调用方式来处理文件操作和利用 C标准库实现文件操作相比,应该是标准库函数更易用,但系统调用方式也有它的用武之地,例如驱动开发。