LInux文件基础知识和文件目录操作(二)文件I/O操作
1、文件I/O操作分为两部分来讲解:
第一部分是非缓冲文件操作,这种操作适合于比较小规模文件的读写和对实时性要求很高的设备的数据通信,这类操作是系统调用提供的;
第二部分是缓冲文件操作,所面向的则是大规模非实时性数据处理问题,这类操作是标准输入输出库提供的。
2、非缓冲文件操作:
非缓冲文件操作是针对于小规模文件的读写,或者是实时设备。执行非缓冲文件操作后,应用程序将立即获取或传送数据。非缓冲文件操作的函数只有两个,分别是read()函数和write()函数,这些函数通过文件标识符找到文件。在介绍这些函数前,首先介绍三个操作系统预先分配的文件标识符:
0,标准输入,即通过终端输入。
1,标准输出,即通过终端输出。
2,标准错误,系统中存放错误信息的堆栈。
注:非缓冲文件操作函数涉及:open/close/read/write/lseek
3、缓冲文件操作:
基于缓冲区的文件I/O操作减少了对设备的物理数据接口访问次数,从而使大量数据的I/O操作的系统开支减少,并将实际读写速度提升。标准输入输出库定义了文件流结构指针FILE*作为文件的标识,同时提供了一系列缓冲文件操作函数。有三个文件流是系统预定义的,分别是:
stdin,标准输入。
stdout,标准输出。
stderr,标准错误。
注:缓冲文件操作函数涉及:fopen/fclose/fread/fwrite/fscanf/fprintf/fseek/fflush/fgetpos/fsetpos……
4、code:
(1) FileHandler.c: non-buffer reading file
#include <stdio.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(){
char c[8000];
int fd, i, j=0;
fd = open("/usr/include/gnu-versions.h", O_RDONLY); //get file description
if(fd != -1){
i = read(fd, c, 8000); //read information from file
for(; i>0; i--){
putchar(c[j++]); //print char into standard output
}
}else{
puts("open file failed.");
}
return 0;
}
(2) FileHandler2.c: non-buffer write
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#define NUMBER 2000
int main(){
char c[NUMBER];
int fd, i;
i = read(0, c, NUMBER); //standard input
if(i>0){
fd = open("test", O_RDWR);
if(fd != -1){
if(write(fd, c, i) != i){
perror("write test error.");
}
puts("write test successfully.");
close(fd);
}else{
perror("open test failed");
}
}else{
perror("read standard input error.");
}
return 0;
}
(3)FileHandler3.c : lseek function : change file pointer.
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(){
int fd = open("test", O_RDWR | O_CREAT, 0664);
if(fd != -1){
if(write(fd, "12345", 5) != 5){
perror("write error!");
}
lseek(fd, 2, SEEK_SET); //change file pointer position.
if(write(fd, "abcdefg", 7) != 7){
perror("write error set");
}
lseek(fd, -3, SEEK_CUR);
if(write(fd, "asdfghjkl", 9) != 9){
perror("write error cur");
}
lseek(fd, -2, SEEK_END);
if(write(fd, "zxcvbnm", 7) != 7){
perror("write error end");
}
close(fd);
}
return 0;
}
(4) FileHandler4.c: buffer read and write.
#include <stdio.h>
#define SIZE 65536
#define LENGTH 1024
int main(){
FILE *fp;
char c[SIZE];
int i;
fp = fopen("/usr/include/gnu-versions.h", "r");
if(fp != NULL){
puts("open file success");
}else{
perror("open failed");
}
i = fread(c, LENGTH, SIZE/LENGTH, fp);
fclose(fp);
if(i > 0){
fp = fopen("test", "rw+");
if(fp != NULL){
i = fwrite(c, LENGTH, SIZE/LENGTH, fp);
if(i > 0){
fflush(fp);
}
fclose(fp);
}else{
perror("open test error");
}
}
if(fclose(fp) != EOF){
puts("close file success");
}else{
perror("close failed");
}
return 0;
}
(5) FileHandler5.c: buffer fscanf and fprintf
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
struct buddy{
char name[50];
int tel;
char address[100];
};
int main(){
if(creat("buddy", 0664) == -1){
perror("create buddy failed");
return 1;
}
FILE * fp= fopen("buddy", "rw+");
if(fp != NULL){
fprintf(fp, "<name>%s <tel>%d <address>%s", "wangle",
1234567890,"China");
fclose(fp);
struct buddy bud;
fp = fopen("buddy", "rw+");
fscanf(fp, "<name>%s <tel>%d <address>%s</address>", bud.name,
&bud.tel,bud.address);
fclose(fp);
printf("<name>%s <tel>%d <address>%s</address>", bud.name,
bud.tel,bud.address);
}
return 0;
}
LInux文件基础知识和文件目录操作(二)文件I/O操作的更多相关文章
- LInux文件基础知识和文件目录操作(系统调用函数方式)
1.进程是处于活动状态的程序,某个用户通过操作系统运行程序所产生的进程代表着该用户的行为.如果用户不具备访问某个目录和文件的权限,那么该用户的进程也不能访问. 2.Linux系统中文件安全机制是通过给 ...
- Kali Linux渗透基础知识整理(二)漏洞扫描
Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网 ...
- Kali Linux渗透基础知识整理(四):维持访问
Kali Linux渗透基础知识整理系列文章回顾 维持访问 在获得了目标系统的访问权之后,攻击者需要进一步维持这一访问权限.使用木马程序.后门程序和rootkit来达到这一目的.维持访问是一种艺术形式 ...
- Linux shell基础知识(上)
Linux shell基础知识(上) 目录 一.shell介绍 二.命令历史 三.命令补全和别名 四.通配符 五.输入输出重定向 六.管道符和作业控制 七.shell变量 八.环境变量配置文件 九.b ...
- Linux入门基础知识
注:内容系兄弟连Linux教程(百度传课:史上最牛的Linux视频教程)的学习笔记. Linux入门基础知识 1. Unix和Linux发展历史 二者就像父子关系,当然Unix是老爹.1965年,MI ...
- C# 基础知识系列- 14 IO篇 文件的操作 (3)
本篇继续前两篇内容,跟大家介绍一下Path类以及FileSystemInfo这个类的主要方法和属性. 上文提到,在<C# 基础知识系列-IO篇>之文件相关的内容完结之后,会带领大家开发一个 ...
- Linux文件管理 | Linux 文件基础知识
目录 Linux 常用文件类别 Linux 目录结构概述 LInux 系统目录及说明 一.Linux 常用文件类别 1.文件 在Linux上系统上,有一切皆文件的说法,就是说任何软件和I/O设备都 ...
- Linux Shell 基础知识(二)
1.本文知识结构 2.文件的查询与检索 2.1. cd 目录切换 找到文件/目录位置:cd 切换到上一个工作目录: cd - 切换到home目录: cd or cd ~ 显示当前路径: pwd 更改当 ...
- C# 基础知识系列- 14 IO篇 文件的操作
0. 前言 本章节是IO篇的第二集,我们在上一篇中介绍了C#中IO的基本概念和一些基本方法,接下来我们介绍一下操作文件的方法.在编程的世界中,操作文件是一个很重要的技能. 1. 文件.目录和路径 在开 ...
随机推荐
- Delphi 正则表达式之TPerlRegEx
官方网站: http://www.regular-expressions.info/delphi.html 直接下载: http://www.regular-expressions.info/down ...
- python 线程,进程与协程
引言 线程 创建普通多线程 线程锁 互斥锁 信号量 事件 条件锁 定时器 全局解释器锁 队列 Queue:先进先出队列 LifoQueue:后进先出队列 PriorityQueue:优先级队列 deq ...
- 微服务架构 技能图谱skill-map
# 微服务架构 技能图谱 ## 理论基础### 概念#### 多微合适 - 非代码函数 - 非重写时间 - 适合团队最重要 - 独立业务属性 - 全功能团队 #### 进程隔离 - 服务运行在独立的进 ...
- linux 日志文件查看
记录下日志中常用的日志查看命令. 1. tail -n 10 -f **.log 显示日志文件尾部10行日志,当有新日志产生,会追加显示. 2. tail 命令 现ff.sh中有如下信息: [ro ...
- Windows 08R2_破解管理员密码
目录 目录 破解Windows 08R2管理员密码 破解Windows 08R2管理员密码 将登录界面的功能链接变成cmd.exe的链接,通过CMD进入到目录C:\Windows\System32下, ...
- 2019牛客多校第七场C-Governing sand(线段树+枚举)
Governing sand 题目传送门 解题思路 枚举每一种高度作为最大高度,则需要的最小花费的钱是:砍掉所有比这个高度高的树的所有花费+砍掉比这个高度低的树里最便宜的m棵树的花费,m为高度低的里面 ...
- Java 实例 - 连接字符串
以下实例演示了通过 "+" 操作符和StringBuffer.append() 方法来连接字符串,并比较其性能: StringConcatenate.java 文件 1 2 3 4 ...
- Linux下多线程pthread内存泄露
目标文件:/proc/<pid>/maps 若其中出现了大量的8K左右的内存碎片,则说明出现了内存泄露.同理,如果相应pid进程的maps文件中出现了很多内存碎片,也说明出现了内存泄露. ...
- Python-02 生成器表达式,列表推导式
列表推导式和生成器表达式 列表推导式,生成器表达式1,列表推导式比较直观,占内存2,生成器表达式不容易看出内容,省内存. [ 变量(加工后的数据) for 变量i in 可迭代的数据类型 ] 列表 ...
- Linux 版本查詢
# uname -a 查看 Kernel版本 # cat /etc/redhat-release查看 linux版本(以RedHat為例) 1.核心查詢:uname -a結果:Linux 2.x.x ...