write函数 C语言中的Write函数
大家好,今天小编来为大家解答以下的问题,关于write函数,C语言中的Write函数这个很多人还不知道,现在让我们一起来看看吧!
ofstream中write函数怎么用的
一旦,我们建立好了tcp连接之后,我们就可以把得到的fd当作文件描述符来使用。
由此网络程序里最基本的函数就是read和write函数了。
ssize_t write(int fd, const void*buf,size_t nbytes);
write函数将buf中的nbytes字节内容写入文件描述符fd.成功时返回写的字节数.失败时返回-1.并设置errno变量.在网络程序中,当我们向套接字文件描述符写时有两可能.
1)write的返回值大于0,表示写了部分或者是全部的数据.这样我们用一个while循环来不停的写入,但是循环过程中的buf参数和nbyte参数得由我们来更新。也就是说,网络写函数是不负责将全部数据写完之后在返回的。
2)返回的值小于0,此时出现了错误.我们要根据错误类型来处理.
如果错误为EINTR表示在写的时候出现了中断错误.
如果为EPIPE表示网络连接出现了问题(对方已经关闭了连接).
为了处理以上的情况,我们自己编写一个写函数来处理这几种情况.
int my_write(int fd,void*buffer,int length)
{
int bytes_left;
int written_bytes;
char*ptr;
ptr=buffer;
bytes_left=length;
while(bytes_left>0)
{
/*开始写*/
written_bytes=write(fd,ptr,bytes_left);
if(written_bytes<=0)/*出错了*/
{
if(errno==EINTR)/*中断错误我们继续写*/
written_bytes=0;
else/*其他错误没有办法,只好撤退了*/
return(-1);
}
bytes_left-=written_bytes;
ptr+=written_bytes;/*从剩下的地方继续写*/
}
return(0);
}
读函数read
ssize_t read(int fd,void*buf,size_t nbyte)
read函数是负责从fd中读取内容.当读成功时,read返回实际所读的字节数,如果返回的值是0表示已经读到文件的结束了,小于0表示出现了错误.如果错误为EINTR说明读是由中断引起的,如果是ECONNREST表示网络连接出了问题.和上面一样,我们也写一个自己的读函数.
int my_read(int fd,void*buffer,int length)
{
int bytes_left;
int bytes_read;
char*ptr;
bytes_left=length;
while(bytes_left>0)
{
bytes_read=read(fd,ptr,bytes_read);
if(bytes_read<0)
{
if(errno==EINTR)
bytes_read=0;
else
return(-1);
}
else if(bytes_read==0)
break;
bytes_left-=bytes_read;
ptr+=bytes_read;
}
return(length-bytes_left);
}
数据的传递
有了上面的两个函数,我们就可以向客户端或者是服务端传递数据了.比如我们要传递一个结构.可以使用如下方式
/*客户端向服务端写*/
struct my_struct my_struct_client;
write(fd,(void*)&my_struct_client,sizeof(struct my_struct);
/*服务端的读*/
char buffer[sizeof(struct my_struct)];
struct*my_struct_server;
read(fd,(void*)buffer,sizeof(struct my_struct));
my_struct_server=(struct my_struct*)buffer;
在网络上传递数据时我们一般都是把数据转化为char类型的数据传递.接收的时候也是一样的注意的是我们没有必要在网络上传递指针(因为传递指针是没有任何意义的,我们必须传递指针所指向的内容)
6.1 recv和send
recv和send函数提供了和read和write差不多的功能.不过它们提供了第四个参数来控制读写操作.
int recv(int sockfd,void*buf,int len,int flags)
int send(int sockfd,void*buf,int len,int flags)
前面的三个参数和read,write一样,第四个参数可以是0或者是以下的组合
_______________________________________________________________
| MSG_DONTROUTE|不查找表|
| MSG_OOB|接受或者发送带外数据|
| MSG_PEEK|查看数据,并不从系统缓冲区移走数据|
| MSG_WAITALL|等待所有数据|
|--------------------------------------------------------------|
MSG_DONTROUTE:是send函数使用的标志.这个标志告诉IP.目的主机在本地网络上面,没有必要查找表.这个标志一般用网络诊断和路由程序里面.
MSG_OOB:表示可以接收和发送带外的数据.关于带外数据我们以后会解释的.
MSG_PEEK:是recv函数的使用标志,表示只是从系统缓冲区中读取内容,而不清除系统缓冲区的内容.这样下次读的时候,仍然是一样的内容.一般在有多个进程读写数据时可以使用这个标志.
MSG_WAITALL是recv函数的使用标志,表示等到所有的信息到达时才返回.使用这个标志的时候recv回一直阻塞,直到指定的条件满足,或者是发生了错误. 1)当读到了指定的字节时,函数正常返回.返回值等于len 2)当读到了文件的结尾时,函数正常返回.返回值小于len 3)当操作发生错误时,返回-1,且设置错误为相应的错误号(errno)
MSG_NOSIGNAL is a flag used by send() in some implementations of the Berkeley sockets API.
This flag requests that the implementation does not to send a SIGPIPE signal on errors on stream oriented sockets when the other end breaks the connection. The EPIPE error is still returned as normal.
Though it is in some Berkely sockets APIs(notably Linux) it does not exist in what some refer to as the reference implementation, FreeBSD, which instead uses a socket option SO_NOSIGPIPE?.对于服务器端,我们可以使用这个标志。目的是不让其发送SIG_PIPE信号,导致程序退出。
如果flags为0,则和read,write一样的操作.还有其它的几个选项,不过我们实际上用的很少,可以查看 Linux Programmer's Manual得到详细解释.
一旦,我们建立好了tcp连接之后,我们就可以把得到的fd当作文件描述符来使用。
由此网络程序里最基本的函数就是read和write函数了。
ssize_t write(int fd, const void*buf,size_t nbytes);
write函数将buf中的nbytes字节内容写入文件描述符fd.成功时返回写的字节数.失败时返回-1.并设置errno变量.在网络程序中,当我们向套接字文件描述符写时有两可能.
1)write的返回值大于0,表示写了部分或者是全部的数据.这样我们用一个while循环来不停的写入,但是循环过程中的buf参数和nbyte参数得由我们来更新。也就是说,网络写函数是不负责将全部数据写完之后在返回的。
2)返回的值小于0,此时出现了错误.我们要根据错误类型来处理.
如果错误为EINTR表示在写的时候出现了中断错误.
如果为EPIPE表示网络连接出现了问题(对方已经关闭了连接).
为了处理以上的情况,我们自己编写一个写函数来处理这几种情况.
int my_write(int fd,void*buffer,int length)
{
int bytes_left;
int written_bytes;
char*ptr;
ptr=buffer;
bytes_left=length;
while(bytes_left>0)
{
/*开始写*/
written_bytes=write(fd,ptr,bytes_left);
if(written_bytes<=0)/*出错了*/
{
if(errno==EINTR)/*中断错误我们继续写*/
written_bytes=0;
else/*其他错误没有办法,只好撤退了*/
return(-1);
}
bytes_left-=written_bytes;
ptr+=written_bytes;/*从剩下的地方继续写*/
}
return(0);
}
读函数read
ssize_t read(int fd,void*buf,size_t nbyte)
read函数是负责从fd中读取内容.当读成功时,read返回实际所读的字节数,如果返回的值是0表示已经读到文件的结束了,小于0表示出现了错误.如果错误为EINTR说明读是由中断引起的,如果是ECONNREST表示网络连接出了问题.和上面一样,我们也写一个自己的读函数.
int my_read(int fd,void*buffer,int length)
{
int bytes_left;
int bytes_read;
char*ptr;
bytes_left=length;
while(bytes_left>0)
{
bytes_read=read(fd,ptr,bytes_read);
if(bytes_read<0)
{
if(errno==EINTR)
bytes_read=0;
else
return(-1);
}
else if(bytes_read==0)
break;
bytes_left-=bytes_read;
ptr+=bytes_read;
}
return(length-bytes_left);
}
数据的传递
有了上面的两个函数,我们就可以向客户端或者是服务端传递数据了.比如我们要传递一个结构.可以使用如下方式
/*客户端向服务端写*/
struct my_struct my_struct_client;
write(fd,(void*)&my_struct_client,sizeof(struct my_struct);
/*服务端的读*/
char buffer[sizeof(struct my_struct)];
struct*my_struct_server;
read(fd,(void*)buffer,sizeof(struct my_struct));
my_struct_server=(struct my_struct*)buffer;
在网络上传递数据时我们一般都是把数据转化为char类型的数据传递.接收的时候也是一样的注意的是我们没有必要在网络上传递指针(因为传递指针是没有任何意义的,我们必须传递指针所指向的内容)
6.1 recv和send
recv和send函数提供了和read和write差不多的功能.不过它们提供了第四个参数来控制读写操作.
int recv(int sockfd,void*buf,int len,int flags)
int send(int sockfd,void*buf,int len,int flags)
前面的三个参数和read,write一样,第四个参数可以是0或者是以下的组合
_______________________________________________________________
| MSG_DONTROUTE|不查找表|
| MSG_OOB|接受或者发送带外数据|
| MSG_PEEK|查看数据,并不从系统缓冲区移走数据|
| MSG_WAITALL|等待所有数据|
|--------------------------------------------------------------|
MSG_DONTROUTE:是send函数使用的标志.这个标志告诉IP.目的主机在本地网络上面,没有必要查找表.这个标志一般用网络诊断和路由程序里面.
MSG_OOB:表示可以接收和发送带外的数据.关于带外数据我们以后会解释的.
MSG_PEEK:是recv函数的使用标志,表示只是从系统缓冲区中读取内容,而不清除系统缓冲区的内容.这样下次读的时候,仍然是一样的内容.一般在有多个进程读写数据时可以使用这个标志.
MSG_WAITALL是recv函数的使用标志,表示等到所有的信息到达时才返回.使用这个标志的时候recv回一直阻塞,直到指定的条件满足,或者是发生了错误. 1)当读到了指定的字节时,函数正常返回.返回值等于len 2)当读到了文件的结尾时,函数正常返回.返回值小于len 3)当操作发生错误时,返回-1,且设置错误为相应的错误号(errno)
MSG_NOSIGNAL is a flag used by send() in some implementations of the Berkeley sockets API.
This flag requests that the implementation does not to send a SIGPIPE signal on errors on stream oriented sockets when the other end breaks the connection. The EPIPE error is still returned as normal.
Though it is in some Berkely sockets APIs(notably Linux) it does not exist in what some refer to as the reference implementation, FreeBSD, which instead uses a socket option SO_NOSIGPIPE?.对于服务器端,我们可以使用这个标志。目的是不让其发送SIG_PIPE信号,导致程序退出。
如果flags为0,则和read,write一样的操作.还有其它的几个选项,不过我们实际上用的很少,可以查看 Linux Programmer's Manual得到详细解释.
write scanf均为库函数吗
都是
scanf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。与printf函数相同,C语言也允许在使用scanf函数之前不必包含stdio.h文件。scanf函数的一般形式为:
scanf(“格式控制字符串”,地址表列);
其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串。地址表列中给出各变量的地址。地址是由地址运算符“&”后跟变量名组成的。
函数名:write
头文件:<io.h>
函数原型: int write(int handle,void*buf,int len);
功能:获取打开文件的指针位置
参数:int handle为要获取文件指针的文件句柄
void*buf为要写入的内容
int len为要写入文件的长度
返回值:返回实际写入文件内容的长度
程序例:将字符串写入文件,并读取文件中的字符串,输出结果
C语言中的Write函数
write()写文件函数
原形:int write(int handle,char*buf,unsigned len)
功能:将缓冲区的数据写入与handle相联的文件或设备中,handle是从creat、open、dup或dup2调用中得到的文件句柄。
对于磁盘或磁盘文件,写操作从当前文件指针处开始,对于用O_APPEND选项打开的文件,写数据之前,文件指针指向EOF;对于设备,字节被直接传送到设备中。
扩展资料:
用法
头文件:<unistd.h>
write有两种用法。一种是:ssize_t write(int fd, const void*buf, size_t nbyte);
fd:文件描述符;
buf:指定的缓冲区,即指针,指向一段内存单元;
nbyte:要写入文件指定的字节数;
返回值:写入文档的字节数(成功);-1(出错)
write函数把buf中nbyte写入文件描述符handle所指的文档,成功时返回写的字节数,错误时返回-1.
另一种是: write(const char* str,int n)
str是字符指针或字符数组,用来存放一个字符串。n是int型数,它用来表示输出显示字符串中字符的个数。
write("string",strlen("string");表示输出字符串常量
参考资料来源:百度百科-write函数
MFC中的Write函数的参数及用法
不知道说的是哪个类的Write用法我想应该是CFILE类的Write的用法
virtualvoidWrite(
constvoid*lpBuf,
UINTnCount);
这个MSDN中的Write的形式。
第一个参数表示存储要写的东西的字符串或者字符数组。
第二个参数表示你要从这个字符串或者字符数组中写多少个字符到文件中。
举个小例子
CFilefile(1.TXT,CFile::modeWrite);
CStringstr="abcdefg";
file.Write(str,5);
第一行为定义一个CFile类的对象其中第一个参数是我们要打开一个1.TXT文件
第二个参数是我们要用写文件的方式使用这个文件
第二行为定义一个字符串,它的内容为abcdefg.
第三行就是使用这个函数了,讲这个字符串的内容写到文件中,然后写5个字符
我们打开1.TXT文件就可以看到5个字符。
他们是abcde
祝你好运如果有什么不明白还可以问我
我的百度号为pengxuewanp
感谢您花时间阅读本文!我们希望通过对write函数和C语言中的Write函数的问题进行探讨,为您提供了一些有用的见解和解决方案。如果您需要更多帮助或者有其他疑问,请不要犹豫与我们联系。