write 和 read 函数的用法:
write :
ssize_t write ( int filedes, const void * buff, size_t nbytes );
返回类型和参数类型:
typedef int ssize_t
typedef unsigned long size_t
第一个参数:filedes 类型是 int ,用于指定一个文件描述符,指定要写入的文件
第二个参数:buff 用于指向一个缓冲区,写入的内容存放在缓冲区中
缓冲区解释:指连续的内存空间,典型的应用是在数据的发送方和接收方之间起到一个调节和缓冲的作用,比如说是蓄水池
如果数据的发送速度比接收速度快,缓冲区可以收纳来不及取走的数据
第二个参数的指针指向内容的起始处,C语言不能声明 void类型的变量,引入了指向 void 类型的指针,通常称之为通用指针,可以指向任何变量,(书上表述的一句话很有趣:虽然瞎话(void)是不存在的事实,但说瞎话的人(指向void的指针)却是存在的)
使用这种指针类型的作用就是适应传入的各种指针类型。
由于指向的具体类型不能确定,故指向 void 类型的指针不能用于访问它所指向的变量,因为无法知道变量的大小和数据存储格式;也不能做指针的加减操作,因为无法知道地址增加的长度:
eg : int x;
void *pv = & x;
上面两句声明是正确的; 下面是错误的
*pv = 330;
pv++;
第三个参数是要写入的字节数
写文件的过程中发生了错误,则它返回 -1
调用:write (fd, name, strlen(name));
< unistd.h > 引入了计算字符串长度的函数 strlen ,
size_t strlen ( const cahr * str ) ; 要求传入一个指向字符类型的指针作为参数,返回字符串的字符个数,不包含末尾的 ‘ \0 ’
如果多次调用函数 write , 则每次写入的内容都位于上一次写入的内容之后,如果多次读取文件,则每次都从上一次读取的内容之后开始。是因为在操作系统内部记录着用于操作该文件所需要的各种数据,其中包含一个文件偏移量(俗称文件指针)它是距离文件开头的字节数。每当读取或是写入文件时,将自动调整文件位置,使其位于下一次读写的开始处。
关闭文件:
int close ( int filedes ) ;
写入文件内容后:发现写入的内容有图形符号,是因为所有文本编辑软件都试图将文件的内容解释为图形字符, 但前面写入的是整数, 只有当他偶尔与某个图形字符的编码是同一个数字时,才会显示为奇怪的字符。
read函数:
ssize_t read ( int filedes, void * buff , size_t nbytes );
读取成功,该函数返回实际读取的字节数,若已经读到文件尾则返回0,如果在读的过程中出错则返回1
使用: 注意不能同时在一个程序中对一个文件读写,如果要实现同时读写的功能,需要先在这个文件中改写后保存为另外一个文件,然后读这个保存的文件
(怎样做到改写后直接保存为另外一个文件的名称呢)
write 实际编程:
/**********************c0608.c*********************/
# include <unistd.h>
# include <fcntl.h>
# include <sys/stat.h>
int main (void)
{
int fd;
fd = open ("myfile1.dat", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
if (fd == -1) return -1;
char name [] = "LiuChangjiang", gender = 'M', age = 36;
unsigned int score = 2200;
write (fd, name, strlen (name));
write (fd, & gender, sizeof gender);
write (fd, & age, sizeof age);
write (fd, & score, sizeof score);
close (fd);
}
read 函数使用:
//打开文件,读取文件的内容
#include<stdio.h>
#include<io.h>
#include<fcntl.h>
int main(void){
int fd=open("myfile1.dat",O_RDONLY);
if(fd==-1){
printf("can not open the file\n");
return 1;
}
char buf[1024]={"\0"};
int len=read(fd,buf,1024);
printf("%s\nlen=%d\n",buf,len);
close(fd);
return 0;
}
结合使用:
还不会
暂时先了解到这