linux c编程:文件的读写
Linux系统中提供了系统调用函数open()和close()用于打开和关闭一个存在的文件
int open(const char *pathname,int flags)
int open(const char *pathname,int flags,mode_t mode)
int open(const char *pathname,mode_t mode)
其中flag代表文件的打开方式
O_RDONLY: 以只读方式打开文件
O_WRONLY:以只写的方式打开文件
O_RDWR:以读写的方式打开文件
O_CREAT:若打开的文件不存在,则创建该文件
O_EXCL:如果打开文件是设置了O_CREAT,但是该文件存在,则导致调用失败
O_TRUNC:如果以只写或只读方式打开一个已存在的文件,将该文件截至0
O_APPEND:追加的方式打开文件
O_NONBLOCK:用于非堵塞接口i/o
O_NODELAY
O_SYNC:当数据被写入外存或者其他设备后,操作才返回。
其中mode是打开的权限
S_IRWXU 00700 设置文件所有者的读,写,执行权限
S_IRWXG 00070 设置文件所在用户组的读,写,执行权限
S_IRWXO 00007 设置其他用户的读,写,执行权限
S_IRUSR 00400 设置文件所有者的读权限
S_IWUSR 00200 设置文件所有的写权限
S_IXUSR 00100 设置文件所有者的执行权限
S_IRGRP 00040 设置用户组的读权限
S_IWGRP 00020 设置用户组的写权限
S_IXGRP 00010 设置用户组的执行权限
S_IROTH 00004 设置其他用户的读权限
S_IWOTH 00002 设置其他用户的写权限
S_IXOTH 00001 设置其他用户的执行权限
文件的读操作:
ssize_t
read(int fd,void *buf,size_t count);
fd代表文件描述符,buf代表读取的数据存放的buf指针所指向的缓冲区,count代表读取数据的字节数
函数调用成功,返回为读取的字节数,否则返回-1
文件读和写的例子
void
open_and_read_file()
{
int
fd,n;
char
buf[100];
char
*path="/home/zhf/zhf/c_prj/c_test.txt";
fd=open(path,O_RDWR);
n=read(fd,buf,20);
printf("the
content is %s\n",buf);
}
在这里文件都是从头开始读的,那么如果我想从某个位置比如第N个字节开始读取的时候该如何操作呢,这里就需要用到文件定位函数lseek
off_t
lseek(int fildes,off_t offset,int whence);\
fildes是文件描述符
offset是偏移量
whence代表用于偏移时的相对位置,可以取如下的几个值
SEEK_SET:
从文件的开头位置计算偏移量
SEEK_CUR:
从当前的位置开始计算偏移量
SEEK_END:
从文件的结尾开始计算偏移量
函数修改如下:
首先采用lseek函数将文件定位到从第11个字节开始,然后read将从第11个字节开始读取。
对于写操作也是一样的。
void
open_and_read_file()
{
int
fd,n;
char
buf[100];
char
*path="/home/zhf/zhf/c_prj/c_test.txt";
int
i;
fd=open(path,O_RDWR);
i=lseek(fd,11,SEEK_SET);
n=read(fd,buf,20);
printf("the
content is %s\n",buf);
close(fd);
}
一个完整的创建,读,写文件的例子:
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
void write_file(int fd){
char buf[]="abcde\n";
write(fd,buf,sizeof(buf));
close(fd);
}
void read_file(){
int fd;
char *path="/home/zhf/test1.txt";
char result[20];
fd=open(path,O_RDONLY);
read(fd,result,10);
printf("The content is %s",result);
close(fd);
}
int create_file(){
int fd;
char *path="/home/zhf/test1.txt";
fd=creat(path,00777);
return fd;
}
前面介绍的操作都是基于文件描述符的文件操作,下面来介绍基于流的文件操作。两者有什么区别呢:
缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”,
装满后再从内存“缓冲区”依此读入接收的变量。执行写文件的操作时,先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写入文件。由此可以看出,内存
“缓冲区”的大小,影响着实际操作外存的次数,内存“缓冲区”越大,则操作外存的次数就少,执行速度就快、效率高。一般来说,文件“缓冲区”的大小随机器
而定。主要有fopen,
fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek,
ftell,
rewind等
2.非缓冲文件系统
缓冲文件系统是借助文件结构体指针来对文件进行管理,通过文件指针来对文件进行访问,既可以读写字符、字符串、格式化数据,也可以读写二进制数
据。非缓冲文件系统依赖于操作系统,通过操作系统的功能对文件进行读写,是系统级的输入输出,它不设文件结构体指针,只能读写二进制文件,但效率高、速度
快,由于ANSI标准不再包括非缓冲文件系统,因此建议大家最好不要选择它。本书只作简单介绍。open,
close, read, write, getc, getchar, putc, putchar 等。
open
是系统调用
返回的是文件句柄,文件的句柄是文件在文件描述副表里的索引,fopen是C的库函数,返回的是一个指向文件结构的指针。
linux中的系统函数是open,fopen是其封装函数。fopen可以移植,open不能
来看fopen函数:FILE
*fopen(const char *path,const char *mode)
path代表文件名路径
mode代表文件的打开方式。有
r,r+,w,w+,a,a+等方式
个字节
int
fgetc(FILE *stream). 如果出错或者读到文件末尾,则返回EOF
个文件
int
fputc(int c,FILE *stream);
实例代码:
void
fopen_file()
{
int
i;
char
ch;
FILE
*fp;
char
*path="/home/zhf/zhf/c_prj/c_test.txt";
fp=fopen(path,"r");
for(i=0;i<5;i++)
{
if
((ch=fgetc(fp)) != EOF)
{
printf("%c",ch);
}
}
}
fputc和fgetc函数只能一次性的读取或者写入一个字节,如果想读取或者写入一个字符串则需要用到fgets()和fputs()函数。
Char
*fgets(char *s,int size, FILE *stream);
读取到’\n’转移字符为结束,并在该行末尾添加一个’\0’组成完成的字符串。在size字节范围内没有读到’\n’结束符,则添加一个’\0’
int
fputs(const char *s, FILE *stream);
void
fopen_file()
{
int
i;
char
ch;
char
*str;
FILE
*fp;
char
*path="/home/zhf/zhf/c_prj/c_test.txt";
char
result[100];
fp=fopen(path,"r");
str=fgets(result,20,fp);
printf("%s\n",str);
fclose(fp);
}
同样的基于流操作的也有文件的定位操作函数分别是fseek函数和rewind函数
int
fseek(FILE *stream,long offset,int whence)
这里offset表示移动的字节数,要求位移量是long型数据。以便在文件长度大于64Kb不会出错
whence和前面介绍的一样。
rewind函数的作用是使位置指针重新返回文件的开头,函数没有返回值。
linux c编程:文件的读写的更多相关文章
- Linux系统编程--文件IO操作
Linux思想即,Linux系统下一切皆文件. 一.对文件操作的几个函数 1.打开文件open函数 int open(const char *path, int oflags); int open(c ...
- Linux系统编程@文件操作(一)
只总结了部分常用的内容,详细内容参考<UNIX环境高级编程>及相关书籍. Linux中文件编程可以使用两种方法 Linux系统调用(依赖于系统) C语言库函数(不依赖于系统) Linux系 ...
- linux系统编程--文件IO
系统调用 什么是系统调用: 由操作系统实现并提供给外部应用程序的编程接口.(Application Programming Interface,API).是应用程序同系统之间数据交互的桥梁. C标准函 ...
- Linux shell 编程文件比较
文件比较允许你测试Linux 文件系统上文件和目录的状态 比较 描述 -d file 检查file是否存在并是一个目录 -e file 检查file是否存在 -f file 检查file是否存在并是 ...
- Linux系统编程---文件I/O(open、read、write、lseek、close)
文件描述符 定义:对内核而言,文件描述符相当于一个文件的标识,它是一个非负整数,当打开(open)一个现有文件或者创建(creat)一个新文件时,内核会向进程返回一个文件描述符 在unix中(文件描述 ...
- linux系统编程:IO读写过程的原子性操作实验
所谓原子性操作指的是:内核保证某系统调用中的所有步骤(操作)作为独立操作而一次性加以执行,其间不会被其他进程或线程所中断. 举个通俗点的例子:你和女朋友OOXX的时候,突然来了个电话,势必会打断你们高 ...
- Linux系统编程--文件描述符的复制dup()和dup2()【转】
本文转载自:http://blog.csdn.net/tennysonsky/article/details/45870459 dup() 和 dup2() 是两个非常有用的系统调用,都是用来复制一个 ...
- <转>linux操作系统编程——共享内存读写(采用信号量进行同步互斥)
http://blog.csdn.net/yanghaoran321/article/details/7872722 程序要求: 创建一个写端和一个读端,写端写入数据后读端才开始读,读端读完数据后,写 ...
- Linux Shell 编程 文件转置问题
给定一个文件 file.txt,转置它的内容. 你可以假设每行列数相同,并且每个字段由 ' ' 分隔. 示例: 假设 file.txt 文件内容如下: name age alice 21 ryan 3 ...
- linux命名对文件的读写和退出
vi xxx.txt 打开就能看到里面的内容.按 i 进入编辑模式,然后就可以输入内容了,也可以移动光标到你要删除内容的位置按删除键来删除内容.编辑完后可以按 Esc(键盘左上角) 进入命令模式.然后 ...
随机推荐
- CPU、内存、IO虚拟化关键技术及其优化探索
https://yq.aliyun.com/articles/71295?spm=5176.8091938.0.0.3LQ7NM
- div+css经典三行两列布局
写在前面 在面试的时候遇到这样一个笔试题,使用div+css布局一个三行两列的页面.这里主要考察的是css中postion的具体用法.详细信息可参考我这篇文章: [HTML/CSS]说说positio ...
- 【lombok】lombok---帮你简化生成必要但臃肿的java代码工具 【映射注解和lombok注解同时使用 以及 映射注解放在属性和get方法上的区别】
官方地址:https://projectlombok.org/ GitHub:https://github.com/rzwitserloot/lombok 指导说明文档:http://jnb.ociw ...
- EasyMvc入门教程-高级控件说明(14)列布局控件
想起刚做网页时候,看着这么大的屏幕,一直在 想该如何布局呢,后来经过Table布局,Div布局,Border布局,列式布局. 目前EasyMvc主要支持12列的列式布局(手机兼容性好).请看下面的例子 ...
- Linux内核裁剪的具体步骤
在menuconfig中配置: 详细介绍内核配置选项及删改情况 第一部分:全部删除 Code maturity level options ---> 代码成熟等级选项 []Prompt for ...
- 传输层:TCP 协议
传输层:TCP 协议 一.概述 TCP 和 UDP 处在同一层——运输层,但是它们有很多的不同.TCP 是 TCP/IP 系列协议中最复杂的部分,它具有以下特点: (1) TCP 提供 可靠的 数据传 ...
- lampp、xampp安装文档
第一步:去官网 看这个介绍http://www.apachefriends.org/zh_cn/xampp-linux.html#1677 第二步:下载安装包 2.1 要区分Linux是32位还是64 ...
- sql语句中几个需要注意的点
1.在写join语句的时候,一定要注意不要漏了on语句,例如: Select * from Student inner join Sc on Student.Sno=Sc.sno 2.having语句 ...
- 【秀优越(xie e)】原来出题也能够这么恶心。
通过邪恶的数据范围和数据限制居然能够把一道传统题出成题答2333. 诶毕竟内部互測,题目就不往上贴了. 特殊限制 - - - 题目作废.输出M行"Orz PoPoQQQ" - M ...
- win10 只要打开文件对话框就卡死解决方法
我电脑的问题是:win10系统,只要打开 文件对话框就卡死,假死,cpu100% 一直没有解决,但是只要把缩略图关了,就ok. 但是又想要留着缩略图,还是得显示,于是乎一直在找解决办法. 此方法好像可 ...