文件I/O操作函数 read() write()
read()
函数说明 | read()会把参数fd 所指的文件传送count 个字节到buf 指针所指的内存中. |
头文件 | #include <unistd.h> |
函数原型 | ssize_t read(int fd, void * buf, size_t count); |
参数 | fd:打开的文件描述符 |
buf:指定存储器读出数据的缓冲区 | |
count:指定读出的字节数 | |
返回值 | 成功:读到的字节数 |
0:已到文件尾 | |
-1:出错 设置errno,文件读写位置则无法预期. 错误代码: |
|
备注 |
如果顺利 read()会返回实际读到的字节数, 最好能将返回值与参数count 作比较, 若返回的字节数比要求读取的字节数少, 则有可能读到了文件尾、从管道(pipe)被信号中断了读取动作. |
write()
函数说明 | 把参数buf 所指的内存写入count 个字节到参数fd 所指的文件内. 当然, 文件读写位置也会随之移动. |
头文件 | #include <unistd.h> |
函数原型 | ssize_t write (int fd, const void * buf, size_t count); |
参数 | fd:打开的文件描述符 |
buf:指定存储器写入数据的缓冲区 | |
count:指定写入的字节数 | |
返回值 | 成功:已写的字节数 |
-1:出错 错误代码存入errno 中 write()错误代码: |
|
备注 | 返回值如果小于strlen(buf),需要循环将全部待写数据写入文件 |
例:
/*利用文件IO函数实现文件的拷贝的功能*/
#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <fcntl.h> #define N 64 int main(int argc, char *argv[]) { int fds, fdt, nbyte; char buf[N]; if (argc < 3) { printf("Usage : %s <src_file> <dst_file>\n", argv[0]);//提示输入格式 判断参数个数 return -1; } if ((fds = open(argv[1], O_RDONLY)) < 0)//以只读方式打开源文件 { perror("fail to open"); return -1; } if ((fdt = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0)//创建新的目标文件等待写入 { perror("fail to open"); return -1; } while ((nbyte = read(fds, buf, N)) > 0)//循环读出源文件到buf { write(fdt, buf, nbyte);//循环从buf写入到目标文件 } close(fds);//关闭源文件 close(fdt);//关闭目标文件 return 0; }
作家格拉德威尔在《异数》一书中指出:“人们眼中的天才之所以卓越非凡,并非天资超人一等,而是付出了持续不断的努力。只要经过1万小时的锤炼,任何人都能从平凡变成超凡。”他将此称为“一万小时定律”。要成为某个领域的专家,需要10000小时,按比例计算就是:如果每天工作四个小时,一周工作五天,那么成为一个领域的专家至少需要十年。