文件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(缓冲区指针)函数实现。