C基础文件输入输出操作之write和read函数

本文详细介绍了C语言中的write和read函数,包括函数头文件、参数说明、返回值及功能。通过实例展示了如何使用write函数写入文件,并利用lseek实现追加写入。同时,对read函数进行了讲解,指出了在使用read读取文件时可能出现的乱码问题及其原因,并提供了修正方法。

一、 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';

如此,结果才为正确的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值