文件的输入输出
Linux函数:creat、open、close、read、write和lseek等
C语言:fopen、fclose、fread、fwrite、fseek等
在编写跨平台程序时,最好使用C语言的标准库函数以方便移植,因为creat、open等系统函数使用文件描述符来标识文件,而文件描述符是UNIX/Linux特有的,不方便移植。
1. open函数
打开创建一个文件
Int open(const char *pathname, int flags);
Int open(const char *pathname, int flags,mode_t mode);
Pathname:要打开或创建的含路径的文件名
Flags:打开文件的方式
O_RDONLY:只读方式打开
O_WRONLY:只写方式打开
O_RDWR:可读可写方式打开
O_CREAT:文件不存在则自动创建,只有在此时才需要用到第三个参数mode,以说明新文件的存取权限
O_EXEC:检查文件是否存在,文件若不存在则创建该文件,若文件已存在则将导致打开文件出错。
O_TRUNC:若文件存在并且以可读可写方式打开,此标志会将文件长度清为0,即原文件中保存的数据将丢失,但文件的属性不变。
O_APPEND:所写入的数据会议追加的方式加入到文件后面
O_NONBLOCK或O_NDELAY:以阻塞方式打开文件
只有当第二个参数使用了O_CREAT时,才需要使用第三个参数,以说明新文件的存取权限。新文件的实际存取权限是mode与umask按照(mode&~umask)运算以后的结果。
返回值:
成功:返回一个文件描述符
错误:-1
2. create函数
文件创建
Int create(const char *pathname, mode_t mode)
Pathname:打开或创建的文件名,如果pathname指向的文件不存在,则创建一个新文件。如果pathname指向的文件存在。则源文件被新文件覆盖。
Mode:与open函数mode相同
返回值:
成功:返回一个文件描述符
错误:-1
3. close函数
关闭一个已经打开的文件
int close(int fd);
返回值:
成功:0
错误:-1
4. read函数
从打开的文件中读取数据
Ssize_t read(int fd, void *buf, size_t count)
含义:从文件描述符fd所指向的文件中读取count个字节的数据到buf所指向的缓存中。文件读写指针会随着读取到的字节移动。
建议:如果read()顺利返回实际读到的字节数,最好将返回值与参数count作比较,若返回的字节数比要求读取的字节数少,则有可能读到了文件尾或者read()被信号中断了读取过程,或其它原因。
返回值:
成功:实际读取字节数
错误:-1
5. write函数
将数据写入已打开的文件
Ssize_t write(int fd, const void *buf, size_tcount);
含义:将buf所指向的缓冲区中的count个字节数据写入到由文件描述符fd所指向的文件中。
返回值:
成功:返回写入的字节数
错误:-1
6. lseek函数
移动文件读写指针的位置
Off_t lseek(int fields, off_t offset, intwhence);
Fields:打开的文件描述符
Offset:为根据参数whence来移动读写位置的位移数
Whence:SEEK_SET文件开始处
SEEK_CUR:当前位置
SEEK_END:文件结尾
返回值:
成功:返回当前的读写位置,也就是距离文件开始处多少个字节
错误:-1
Lseek几种常用方法
将文件读写指针移动到文件开头
Lseek(int fildes, 0, SEEK_SET);
将文件读写指针移动到文件尾
Lseek(int fildes, 0, SEEK_END);
获取文件读写指针当前的位置
Lseek(int fildes, 0, SEEK_CUR);
Linux系统不允许lseek()对tty设备进行操作。
代码:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
int ReadData(int fd)
{
intlen;
intret;
inti;
charread_buf[64];
if(lseek(fd,0, SEEK_END) == -1)
{
printf("LseekError Line:%d ! \n", __LINE__);
}
len= lseek(fd, 0, SEEK_CUR);
if(len== -1)
{
printf("LseekError Line:%d ! \n", __LINE__);
}
if(lseek(fd,0, SEEK_SET) == -1)
{
printf("LseekError Line:%d ! \n", __LINE__);
}
printf("Len:%d \n", len);
//read data
ret= read(fd, read_buf, len);
if(ret< 0)
{
printf("ReadError Line:%d ! \n", __LINE__);
}
//print data
for(i= 0; i < len; i++)
{
printf("%c",read_buf[i]);
}
printf("\n");
returnret;
}
int main(int argc, char **argv)
{
intfd;
charwrite_buf[256] = "hello world, i xxxxxxxxxxxxxxxxxxxxxxxxx";
fd= open("example.c", O_RDWR|O_CREAT|O_TRUNC, S_IRWXU);
if(fd== -1)
{
printf("OpenError Line:%d ! \n", __LINE__);
}
else
{
printf("createfile success! \n");
}
//writedata
intwriteLen = write(fd, write_buf, strlen(write_buf));
if(writeLen != strlen(write_buf))
{
printf("WriteError Line:%d ! \n",__LINE__);
}
ReadData(fd);
printf("\n/*------------------------------------*/\n");
if(lseek(fd,10, SEEK_END) == -1)
{
printf("LseekError Line:%d ! \n", __LINE__);
}
writeLen= write(fd, write_buf, strlen(write_buf));
if(writeLen!= strlen(write_buf))
{
printf("WriteError Line:%d ! \n", __LINE__);
}
ReadData(fd);
close(fd);
return0;
}