Linux将所有的硬件设备也当作文件来处理,因此,文件输入输出也是对设备进行操作的基础。文件的IO有两种:
(1) 非缓冲文件操作:
这种操作方式便于对较小规模的文件的读写和对实施行要求很高的设备的数据进行通信,这类操作是系统调用提供的;并且系统只提供了两个文件操作的函数:read()和write()函数。使用的形式为:read(文件标识符,内存块指针,内存块长度);write(文件标识符,内存块指针,内存块长度);其中文件标识符可以是通过open函数打开的文件的标识符,也可以是通过一下三种:
0:标准输入,即通过终端的输入;
1:标准输出,即通过终端的输出;
2:标准错误,系统中存放错误信息的堆栈。
示例:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#define LENGTH 2048
void main()
{
char *fileName = "Test.txt";
int f,i;
char c[LENGTH];
if((i=read(0, c, LENGTH)) < 1)
{
perror("read failed:");
return ;
}
f = open(fileName, O_RDWR | O_CREAT, 0664);
if(f!=-1)
{
if(write(f, c, i) != i)
perror("Write failed:");
puts("save file OK!");
close(f);
}
else
perror("open file failed!");
return ;
}
当然,还有一个函数比较中医,就是lseek(文件标识符,偏移长度, 偏移的起始位置),其中偏移的起始位置可以为SEEK_SET(代表文件的开始位置),SEEK_CUR(代表文件指针的当前位置),SEEK_END(代表文件的末尾位置)。具体用法不再详述。
(2)缓冲文件操作
顾名思义,就是说一部分数据先放在缓冲区中,而当数据的长度要超过缓冲区的范围时才先到物理设备上去,这是通过调用C语言的库函数来实现,因此是C中的标准,故一些实现的函数跟以前学过的一样。标准输入输出库中定义来文件流结构指针FILE*来作为文件的标识,并且同时提供来一系列的缓冲文件操作函数,对应的有三个文件流是系统定义的,分别是:
stdin:标准输入;
stdout:标准输出;
dtderr:标准错误。
缓冲文件操作函数:
fopen(路径,打开方式);其中打开方式为r或rb,w或wb,a或ab等等,没有创建新文件的功能。
fread(缓冲区指针,长度,数量,文件流指针);
fwrite(缓冲区指针,长度,数量,文件流指针);
示例代码:
char buf[SZIE];
FILE * fp = fopen("Test.txt", "r"); //以只读方式打开
fread(buf, LENGTH, SIZE/LENGTH, fp);//其中LENGTH为buf的长度,SIZE为缓冲区的长度,这样就通过每次都读取LENGTH长度,然后全部读入buf中
fclose(fp);
fp = fopen("cope.txt", "rw+"); //以读写的方式打开
fwrite(buf, LENGTH, SIZE/LENGTH, fp);//这样就把数据写入到文件中了
fclose(fp);
下边是文件流的格式化输入与输出:
fscanf(文件流指针,“控制字符串”,输出项列表);
fprintf(文件流指针,“控制字符串”,输出项列表);
示例:
struct buddy
{
char name[50];
unsigned int tel;
char address[200];
}
struct buddy bd;
if(create("buddy", 0664) == -1)
{
perror("创建文件错误!");
return ;
}
FILE *fp;
fp = fopen("buddy", "rw+");
fprintf(fp, "<name>%s,<tel>%d,<address>%s","tom",12345,"China");
close(fp);
fp = fopen("buddy","rw+");
fscanf(fp, "<name>%s,<tel>%d,<address>%s",bd.name, &bd.tel, bd.address);
fclose(fp);
printf("<name>%s,<tel>%d,<address>%s",bd.name,&bd.tel,bd.address);
文件流的定位操作:
fgetpos,fsetpos,Ftell,rewind等函数用于对文件流进行定位操作。