上一篇linux下的IO 函数经常使用(一),fopen 和 open讲述了fopen和open的区别,那接下来配合使用的读写操作
#include
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,
FILE *stream);
size - 指定每个数据结构的长度;
nmemb - 给出要传输的记录个数。
返回值表示成功读写的字节数。
下面举一个标准C输入输出的案例吧如下:
#include
#include
int main(void)
{
char readBuff[1024*2];
//通过只读方式打开一个path为readtext.c的文件,返回文件流file_read
FILE* file_read = fopen("readtext.c","r");
//通过写的方式打开一个path为readtext1.c的文件,返回文件流file_write
FILE* file_write = fopen("readtext1.c","w");
if(file_read && file_write)
{
printf("获取到file1\n");
//从file_read流中读取数据到readBuff中
int size_r = fread(readBuff,sizeof(readBuff),1,file_read);
printf("读取到的数据是:\n%s\n",readBuff);
//将readBuff中数据写入file_write流中
fwrite(readBuff,strlen(readBuff),1,file_write);
printf("readtext1.c code :\n%s\n ",readBuff);
}
fclose(file_read);
fclose(file_write);
fprintf(stdout,"标准输出流输出:\n%s\n",readBuff);
return 0;
}
上述代码其实就是实现了,copy readtext.c中内容 到一个名为readtext1.c的文件中,如果readtext1.c不存在测创建该文件,并且拷贝数据,最后将拷贝的数据打印到终端。
#include
ssize_t write(int fd, const void *buf, size_t count);
ssize_t read(int fd, void *buf, size_t count);
fd:通过open打开的文件描述符
buf:自定义缓冲
count:一次(写入/获取)总字节
返回:
成功 返回读/写 总字节
失败 返回 -1
具体错误信息再errno这个全局变量中,通过 char *strerror(int errnum) 查看详细信息。
#include
#include
#include
#include
#include
#include
#include
#define BUFF_SIZE (1024 * 2)
int main(void)
{
char readBuff[BUFF_SIZE];
int fd_r = open("readtext.c",O_RDONLY|O_CREAT);
int fd_w = open("readtext1.c",O_RDWR|O_TRUNC|O_CREAT);
if(fd_r < 0 || fd_w < 0)
{
fprintf(stderr, "fopen failed, reason: %s. \nexit.\n",strerror(errno));
return -1;;
}
size_t read_lens = read(fd_r,readBuff,BUFF_SIZE);
size_t write_lens = write(fd_w,readBuff,read_lens);
fprintf(stdout,"标准输出流输出:\n%s\n",readBuff);
return 0;
}
俩个案例实现的结果一样都会拷贝复制的作用
在linux系统下标准C库下的I/O读写函数
实际上就是对linux的系统调用 进行了一次封装 ,因为是标准C库,所以在不同的系统下调用不同的内核API,并且操作的是一个文件流
在底层IO 向内核高速页缓存读写数据之前自己多添加了一块缓冲流,
缓冲文件系统的特点是:在用户空间内存开辟一个“缓冲区”,为程序中的每个需要读写的文件使用,
当执行读操作时,优先判断是否在用户空间的“缓冲区”有所需数据,如果没有则从内核态高速页缓存中读取, 装满后再从 内存“缓冲区”依此读入接收的变量。
执行写文件的操作时, 先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写入文件。 由此可以看出,内存 “缓冲区”的大小,影响着用户态到内核态之间的切换,从而影响着程序运行的性能。
内存“缓冲区”越大,则用户态和内核态切换的次数就少,执行速度就快、效率高。
一般来说,文件“缓冲区”的大小随机器 而定。
fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等
linux系统下GLIBC库的I/O读写函数
操作的是文件描述符,文件描述符是linux下的一个概念,linux下的一切设备都是以文件的形式操作.如网络套接字、硬件设备等。当然包括操作文件。
fopen是标准c函数。返回文件流而不是linux下文件句柄。只能在linux下使用该库函数