=========================文件IO=====================
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags); //O_RDONLY | O_APPEND
int open(const char *pathname, int flags, mode_t mode);
返回值 成功:返回文件描述符(大于2整数)
失败:-1
const char *pathname:文件路径
int flags:
O_RDONLY :只读
O_WRONLY :只写
O_RDWR :可读可写
O_APPEND : 以追加方式打开文件,文件指针设置在文件尾
O_CREAT :如果文件不存在,则创建 //用于第二个open
O_EXCL :如果使用O_CREAT选项且文件存在,则返回错误消息。
O_NOCTTY :如果文件为终端,那么终端不可以作为调用open()系统调用的那个进程的控制终端
mode = mode & ~umask
777
0777 & ~0002 1101
0777 & FFFD = 07750111
------------
0101
返回值: 成功:0
失败:-1
int fd:文件描述符 例如:fd=open("/xx/xx",O_RDONLY);
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
ssize_t:-->int
返回值: 成功:读到的实际字节数
int fd:文件描述符
void *buf:数据缓冲区地址
size_t count:想要从fd中读取的字节数
ssize_t write(int fd, const void *buf, size_t count);
返回值: 成功:定入的字节数
失败:-1
int fd:文件描述符
const void *buf:指向写入数据的地址
size_t count:写入的字节数
练习:在一个file的文件里面有一段数据HelloWorld,请将HelloWorld从文件中读出来,并写到file2。
思考题,往一个文件中写一段指定的数据,然后将数据读出来,结果会怎么样
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
返回值 成功:文件指针偏移量(从指向地址到,文件指针指定结束的地址,文件指针偏移的字节)
失败:-1;
int fd:文件描述符
off_t offset:新位置偏移量的基准点的偏移(可正,可负,也可0)
int whence:文件偏移起始位置
SEEK_SET: 文件开头
SEEK_CUR: 文件当前位置
SEEK_END: 文件尾
文件指针指向的位置 = whence+offset
1、帐号与密码登录操作(帐号与密码在文件/home/gec/ps)文件里有usrname:xxxx passwd:xxxxx
然后写一个程序实现输入帐号与密码,如果匹配成功,则提示成功,如果三次匹配失败,退出程序
练习:
采用系统IO实现shell的cp命令(用两个方法去实现)
cp xxx xxx1(xxx源文件,xxx1是目标文件)
./xxx xxx xxx1(xxx源文件,xxx1是目标文件)
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main(void)
{
int fd = -1,i;
int size = -1;
int offset = -1;
/*存放数据的缓冲区*/
char buf1[]="the start";
char buf2[]="the end";
/*文件名*/
char filename[] = "hole.txt";
int len = 8;
/*创建文件hole.txt*/
fd = open(filename,O_RDWR|O_CREAT,766);
if(-1 == fd){
/*创建文件失败*/
return -1;
}
/*将buf1中的数据写入到文件Hole.txt中*/
size = write(fd, buf1,len);
if(size != len){
/*写入数据失败*/
return -1;
}
/*设置文件偏移量为绝对值的32*/
offset = lseek(fd, 32, SEEK_SET);
if(-1 == offset){
/*设置失败*/
return -1;
}
/*将buf2中的数据写入到文件hole.txt中*/
size = write(fd, buf2,len);
if(size != len){
/*写入数据失败*/
return -1;
}
/*关闭文件*/
close(fd);
return 0;
}
结果为:
1、open 打开一个指定的文件,或者是创建一个文件
#include <sys/types.h>#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags); //O_RDONLY | O_APPEND
int open(const char *pathname, int flags, mode_t mode);
返回值 成功:返回文件描述符(大于2整数)
失败:-1
const char *pathname:文件路径
int flags:
O_RDONLY :只读
O_WRONLY :只写
O_RDWR :可读可写
O_APPEND : 以追加方式打开文件,文件指针设置在文件尾
O_CREAT :如果文件不存在,则创建 //用于第二个open
O_EXCL :如果使用O_CREAT选项且文件存在,则返回错误消息。
O_NOCTTY :如果文件为终端,那么终端不可以作为调用open()系统调用的那个进程的控制终端
调用后要记得close();
mode = mode & ~umask
777
0777 & ~0002 1101
0777 & FFFD = 07750111
------------
0101
2、关闭文件
#include <unistd.h>int close(int fd); //fd
返回值: 成功:0
失败:-1
int fd:文件描述符 例如:fd=open("/xx/xx",O_RDONLY);
3、read 从指定目录中读取数据
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
ssize_t:-->int
返回值: 成功:读到的实际字节数
失败:-1;
读完:返回0
int fd:文件描述符
void *buf:数据缓冲区地址
size_t count:想要从fd中读取的字节数
4、write 将数据写入指定的文件
#include <unistd.h>ssize_t write(int fd, const void *buf, size_t count);
返回值: 成功:定入的字节数
失败:-1
int fd:文件描述符
const void *buf:指向写入数据的地址
size_t count:写入的字节数
写某个文件需要先 open打开 并且授权 0766 之类的
练习:在一个file的文件里面有一段数据HelloWorld,请将HelloWorld从文件中读出来,并写到file2。
思考题,往一个文件中写一段指定的数据,然后将数据读出来,结果会怎么样
5、lseek 文件指针偏移
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
返回值 成功:文件指针偏移量(从指向地址到,文件指针指定结束的地址,文件指针偏移的字节)
失败:-1;
int fd:文件描述符
off_t offset:新位置偏移量的基准点的偏移(可正,可负,也可0)
int whence:文件偏移起始位置
SEEK_SET: 文件开头
SEEK_CUR: 文件当前位置
SEEK_END: 文件尾
文件指针指向的位置 = whence+offset
1、帐号与密码登录操作(帐号与密码在文件/home/gec/ps)文件里有usrname:xxxx passwd:xxxxx
然后写一个程序实现输入帐号与密码,如果匹配成功,则提示成功,如果三次匹配失败,退出程序
练习:
采用系统IO实现shell的cp命令(用两个方法去实现)
cp xxx xxx1(xxx源文件,xxx1是目标文件)
./xxx xxx xxx1(xxx源文件,xxx1是目标文件)
利用lseek()开生成空洞文件
1:空洞文件是什么?
看看迅雷下载的文件,在未下载完成时就已经占据了全部文件大小的空间,这时候就是空洞文件。下载时如果没有空洞文件,多线程下载时文件就都只能从一个地方写入,这就不是多线程了。如果有了空洞文件,可以从不同的地址写入,就完成了多线程的优势任务。
在开发过程中有时候需要为某个文件快速地分配固定大小的磁盘空间
(1)可以让文件尽可能的占用连续的磁盘扇区,减少后续写入和读取文件时的磁盘寻道开销;
(2)迅速占用磁盘空间,防止使用过程中所需空间不足。
(3)后面再追加数据的话,不会需要改变文件大小,所以后面将不涉及metadata的修改。
---出至不明网友
空洞文件可以理解为,老妈一大早就去占位置,怕别人拼桌还喊了老爸去,一人坐头位,一人坐尾巴~
作用,提前得到了足够的位置,没人抢。
怎么实现?
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main(void)
{
int fd = -1,i;
int size = -1;
int offset = -1;
/*存放数据的缓冲区*/
char buf1[]="the start";
char buf2[]="the end";
/*文件名*/
char filename[] = "hole.txt";
int len = 8;
/*创建文件hole.txt*/
fd = open(filename,O_RDWR|O_CREAT,766);
if(-1 == fd){
/*创建文件失败*/
return -1;
}
/*将buf1中的数据写入到文件Hole.txt中*/
size = write(fd, buf1,len);
if(size != len){
/*写入数据失败*/
return -1;
}
/*设置文件偏移量为绝对值的32*/
offset = lseek(fd, 32, SEEK_SET);
if(-1 == offset){
/*设置失败*/
return -1;
}
/*将buf2中的数据写入到文件hole.txt中*/
size = write(fd, buf2,len);
if(size != len){
/*写入数据失败*/
return -1;
}
/*关闭文件*/
close(fd);
return 0;
}
结果为:
t h e s t a r \0 \0 \0 \0 \0 \0 \0 \0
\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
t h e e n d \0