文件I/O操作

文件I/O操作分为:非缓冲文件操作和缓冲文件操作。

非缓冲文件操作

针对小规模文件的读写,或者实时设备。执行非缓冲文件操作后,应用程序将立即获取或传送数据。操作函数read(),write()。

系统预先分配的文件标识符

0:标准输入:通过终端输入
1:标准输出:通过终端输出
2:标准错误:系统中存放错误信息的堆栈

read()读取文件

从文件中将信息读取到指定的内存区域中。

read(文件标识符,内存块指针,内存块长度)

文件标识符可以使用oped()函数获取的,获取使用系统预先分配的文件标识符。内存块指针用于指定read()函数读取数据的保存位置。函数返回值为实际读取的长度,如果返回值为零,表示没有读取到任何数据,执行错误时,返回-1.

#define length 2000
int main()
{
	char c[length];
	int f,i,j=0;
	f= open("/usr/include/gnu.h",O_RDONLY,length);//
	if(f != -1)
	{
		i= read(f,c,length);
		if(i>0)
		{	
			for(;i > 0;i--)
				putchar(c[j++]);
		}
		else
			perror("读取");//打印错误信息
	}
	else
		perror("打开文件");
	return 0}

write()写入文件

将指定长度的数据写入文件中。

write(文件标识符,内存块指针,内存块长度)

函数的返回值为实际写入的长度,返回,表示没有写入任何数据。返回-1,表示运行错误。

#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

#define length 2000
int main()
{
        char c[length];
        int f,i;
        puts("输入要保存的信息:");
        if((i=read(0,c,length)<1))
        {
                perror("读取失败");
                return 1;
        }

        f=open("outfile.txt",O_RDWR | O_CREAT,0664);  //打开或新建一个文件
        if(f != -1)
        {
                if(write(f,c,i)!=i) //判断长度是否与实际长度一样
                {
                        perror("写入失败");
                }
                puts("保存文件成功");
                close(f);
        }
        else
        perror("打开文件");

        return 0;
}

指定位置读写文件

lseek(文件标识符,偏移长度,起始位置);

偏移长度用于设置指针的位置,起始位置是定义指针位置的参考坐标,该坐标可用3个枚举常量来表示。

标识名称说明
SEEK_SET以文件的开始位置作为参考坐标
SEEK_CUR以指针的当前位置作为参考指标
SEEK_END以文件的末端位置作为参考坐标

lseek()函数返回值是指针位置,操作失败则返回-1.

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>

#define length 2000
int main()
{
        char c[length];
        int f,i=5;
        f=open("outfile2",O_RDWR | O_CREAT,0664);
        if(f != -1)
        {       puts("打开文件成功");
                if(write(f,"12345",i) != i)
                        perror("写入失败1");
                lseek(f,2,SEEK_SET);
                if((write,"6789a",i) != i)
                        perror("写入失败2");
                lseek(f,-4,SEEK_END);
                if(write(f,"bcdef",i) != i)
                        perror("写入失败3");
                lseek(f,-1,SEEK_CUR);
                if(write(f,"hijkl",i) != i);
                        perror("写入失败4");

                puts("保存文件成功");
                close(f);
        }
        else
                perror("打开文件");

        return 0;
}

缓冲文件操作

缓冲区是程序分配的内存块,在进行数据量比较大去诶实时性要求不高的I/O操作时,一部分数据被置于缓冲区中,只有当数据的长度快要超出缓冲区范围或时间周期达到时,这些数据才会被送入指定的位置。减少了对设备的物理数据接口访问次数,从而使大量数据I/O操作的系统开支减少,并将实际读写速度提升。

打开和关闭文件流

fopen(路径,打开方式)

与系统调用函数open()的作用相似,主要用于文件和终端的输入输出方面,不能对文件的权限进行操作。

参数说明
r以只读的方式打开
w以只写的方式打开,将文件长度置为0
a以只写的方式打开,数据追加在文件末端
r+以修改的方式打开(读与写)
w+以修改的方式打开,将文件长度置为0
a+以修改的方式打开,数据追加在文件末端

当文件不需要使用时,可用fclose()函数关闭,该函数的一般的形式是

fclose(文件流指针);

当fclose()函数执行时,所有放到缓冲区等待写入的数据都将被写入到文件中。如果数据未能被成功保存,fclose()函数返回-1,否则返回0。

读取与写入文件流

读取文件流可使用函数fread();

fread(缓冲区指针,长度,数量,文件流指针);

缓冲区在程序中定义,定义后将指针作为参数传递给fread()函数。参数中长度是指每次读取到缓冲区内的数据长度。参数中数量是指一个进行读取几次。该函数的返回值是读取到缓冲区的次数。如果返回值小于等于数量的话,那么实际读取数据的总和是长度乘返回值。
写入文件流可使用函数fwrite()

fwrite(缓冲区指针,长度,数量,文件流指针);

这两个函数不适用于操作结构化数据的场合,列入操作数据库中的表,原因是fwrite()函数写的文件可能无法在不同硬件的平台之间移植。
如果待写入的数据存储在缓冲区中,而又要立即将缓冲区的数据写入文件,可使用fflush(缓冲区指针)函数实现。

文件流的格式输入和输出

文件流的定位操作

文件流操作的其他函数

文件流操作的错误处理

  • 25
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值