一、 write函数
1 函数头文件
<unistd.h>
2 函数原型
ssize_t write(int handle, void * buf, int len);
3 参数说明
handle----文件句柄,主要是通过open函数打开指定文件得到的对应指定文件的索 引
void * buf----表明要写入指定文件的数据,如char *型字符数组
int len----写入指定文件的数据大小(数据的长度)
4 返回值说明
返回写入指定文件操作的结果,代表实际写入数据的大小(长度),返回-1表明读取失败
5 函数功能
将需要的数据写入到指定文件中
6 简单实例
#include <stdio.h>
// 头文件unistd.h提供write函数
#include <unistd.h>
// 提供open和close文件函数,用于打开文件操作
#include <fcntl.h>
// 提供strlen函数,用作计算字符数组的实际长度(不包含最后的'\0'字符长度)
#include <string.h>
// 提供O_RDWR和O_CREAT
#include <sys/types.h>
#define BUF_LEN 20
int main(void) {
const char buf[BUF_LEN] = "I love China!!!!";
int len, fd;
fd = open("abc.txt", O_RDWR + O_CREAT);
if (fd == -1) {
printf("file abc.txt not exist!!!\n");
return 0;
}
len = write(fd, buf, strlen(buf));
printf("success write buf into file!!! len = %d\n", len);
close(fd);
return 0;
}
输出
success write buf into file!!! len = 16
7 补充
如果在运行上述代码后,将buf改为如下
const char buf[BUF_LEN] = "China!!";
之后,再次编译运行,abc.txt文件中写入的数据如下:
China!!China!!!!
也就是说,write函数往文件中写入外来数据,只会覆盖文件中原始数据的对应外来数据长度的字符,而超出该字符长度的原始数据不会变
8 如何使得write函数在不擦除原有数据的基础上继续写入文件
这边需要使用到lseek函数,此函数可以将当前操作的文件句柄的位置指向某一个特定的位置,如 lseek(fd, 0L, SEEK_END);表示的是,将当前操作该文件的位置指向该文件的结尾处,因此
lseek(fd, 0L, SEEK_END);
len = write(fd, buf, strlen(buf));
如此,即可实现在文件的最后追加数据的目的
二 read函数
1 头文件
<unistd.h>
2 函数原型
int read(int handle,void *buf,int len);
3 参数说明
int handle ---- 指被读取数据对应的文件的文件句柄
void * buf ---- 指读取出来的数据存入的缓冲区
int len ----计划读取数据的长度
4 返回值
返回具体读取到数据的长度,返回-1表示读取失败
5 函数功能
读取指定文件中的数据
6 简单实例
#include <stdio.h>
// 头文件unistd.h提供read函数
#include <unistd.h>
// 提供open和close函数,用于打开文件操作
#include <fcntl.h>
// 提供strlen函数,用作计算字符数组的实际长度(不包含最后的'\0'字符长度)
#include <string.h>
// 提供O_RDONLY
#include <sys/types.h>
#define BUF_LEN 20
int main(void) {
char buf[BUF_LEN];
int len, fd;
fd = open("abc.txt", O_RDONLY);
if (fd == -1) {
printf("file abc.txt not exist!!!\n");
return 0;
}
len = read(fd, buf, BUF_LEN);
printf("read buffer : %s, len = %d\n", buf, len);
len = strlen(buf);
printf("length = %d\n", len);
close(fd);
return 0;
}
输出结果:
read buffer : China!, len = 6
length = 6
7 运行过程中出现的问题
在read的实例中,经常会出现一些莫名打印出乱码的结果,如上述的代码,假设abc.txt文件中的字段为:China!----------
结果打印的是
read buffer : China!----------@G`)�, len = 16
length = 22
可以看到,abc.txt文件中的字符个数为16个,因此read函数读取到的是正常的,那么这个字段的后续6位乱码是哪儿来的呢?
经过测试确认,原因是read函数在读取文件中的数据的时候,获取到的数据字符串为16位,但是由于这个字符数组并未有获取到以'\0'结尾的字符,因此,我们在打印的时候,通过%s打印的字符串并未有获取到结尾标识符,因此会继续打印,直到找到'\0'结束符。
因此,上述的打印结果,在不同的机器上显示的结果是不同的
所以,要打印正确的结果,就需要经过如下的变化
char buf[BUF_LEN + 1];
len = read(fd, buf, BUF_LEN);
buf[len] = '\0';
如此,结果才为正确的
本文详细介绍了C语言中的write和read函数,包括函数头文件、参数说明、返回值及功能。通过实例展示了如何使用write函数写入文件,并利用lseek实现追加写入。同时,对read函数进行了讲解,指出了在使用read读取文件时可能出现的乱码问题及其原因,并提供了修正方法。
274

被折叠的 条评论
为什么被折叠?



