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操作的更多相关文章

  1. LInux文件基础知识和文件目录操作(系统调用函数方式)

    1.进程是处于活动状态的程序,某个用户通过操作系统运行程序所产生的进程代表着该用户的行为.如果用户不具备访问某个目录和文件的权限,那么该用户的进程也不能访问. 2.Linux系统中文件安全机制是通过给 ...

  2. Kali Linux渗透基础知识整理(二)漏洞扫描

    Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网 ...

  3. Kali Linux渗透基础知识整理(四):维持访问

    Kali Linux渗透基础知识整理系列文章回顾 维持访问 在获得了目标系统的访问权之后,攻击者需要进一步维持这一访问权限.使用木马程序.后门程序和rootkit来达到这一目的.维持访问是一种艺术形式 ...

  4. Linux shell基础知识(上)

    Linux shell基础知识(上) 目录 一.shell介绍 二.命令历史 三.命令补全和别名 四.通配符 五.输入输出重定向 六.管道符和作业控制 七.shell变量 八.环境变量配置文件 九.b ...

  5. Linux入门基础知识

    注:内容系兄弟连Linux教程(百度传课:史上最牛的Linux视频教程)的学习笔记. Linux入门基础知识 1. Unix和Linux发展历史 二者就像父子关系,当然Unix是老爹.1965年,MI ...

  6. C# 基础知识系列- 14 IO篇 文件的操作 (3)

    本篇继续前两篇内容,跟大家介绍一下Path类以及FileSystemInfo这个类的主要方法和属性. 上文提到,在<C# 基础知识系列-IO篇>之文件相关的内容完结之后,会带领大家开发一个 ...

  7. Linux文件管理 | Linux 文件基础知识

    目录 Linux 常用文件类别 Linux 目录结构概述 LInux 系统目录及说明 一.Linux 常用文件类别 1.文件   在Linux上系统上,有一切皆文件的说法,就是说任何软件和I/O设备都 ...

  8. Linux Shell 基础知识(二)

    1.本文知识结构 2.文件的查询与检索 2.1. cd 目录切换 找到文件/目录位置:cd 切换到上一个工作目录: cd - 切换到home目录: cd or cd ~ 显示当前路径: pwd 更改当 ...

  9. C# 基础知识系列- 14 IO篇 文件的操作

    0. 前言 本章节是IO篇的第二集,我们在上一篇中介绍了C#中IO的基本概念和一些基本方法,接下来我们介绍一下操作文件的方法.在编程的世界中,操作文件是一个很重要的技能. 1. 文件.目录和路径 在开 ...

随机推荐

  1. 大碗宽面Alpha冲刺阶段博客目录

    大碗宽面Alpha冲刺阶段博客目录 一.Scrum Meeting 1. [第六周会议记录]第六周链接 2. [第七周会议记录]第七周链接 二.测试报告 [alpha阶段测试报告](博客链接) ## ...

  2. kvm无人值守安装centos6

    nginx配置 server { listen default_server; server_name _; root /home/iso; # Load configuration files fo ...

  3. Centos6.6部署Redis集群

    Centos6.6部署Redis集群 1环境准备 1环境安装redis 1安装ruby 2配置redis主从环境 3部署redis sentinel服务器 5集群使用 13当前集群环境说明 13测试功 ...

  4. python中API接口是什么

    首先还是举个例子:你要去银行取钱的例子.如果没有银行柜员给你服务,你自己去存钱,你需要做的事情有: 一,打开金库的大门 二,把钱放进去 三,记账,存放了多少钱 四,离开. 问题解决了,但是其中有不少问 ...

  5. 关于自动化测试学习 selenium

    selenium学习路线 配置你的测试环境,真对你所学习语言,来配置你相应的selenium 测试环境.selenium 好比定义的语义---“问好”,假如你使用的是中文,为了表术问好,你的写法是“你 ...

  6. Struts1.3——文件上传和下载

    1.Struts文件上传 在Web开发中,会经常涉及到文件的上传和下载,比如在注册账户的时候,我们需要上传自己的头像等. 我们可以利用Struts很方便地实现文件的上传. 1.1 开发步骤 现在,假设 ...

  7. 对于Final关键字的总结

    1.final关键字可以用于成员变量.本地变量.方法以及类. 2. final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误. 3. 你不能够对final变量再次赋值. 4.  ...

  8. 转 jmeter 等待时间 pacing think time

    第一部分:Request之间的等待时间的设置 先明确一些概念:1)定时器是在每个sampler(采样器)之前执行的,而不是之后:是的,你没有看错,不管这个定时器的位置放在sampler之后,还是之下, ...

  9. idea下远程debug配置

    一. 背景: 在测试工作中,为方便发现代码中的逻辑问题,尝试使用远程debug模式,在测试过程中走查代码,不仅可以辅助测试减少与开发的沟通成本,更便于了解业务提升测试深度. 二. 配置方式: 1. 调 ...

  10. Zookeeper-技术专区-运作流程分析介绍

    Zookeeper的启动流程 Zookeeper的主类是QuorumPeerMain,启动时读取zoo.cfg配置文件,如果没有配置server列表,则单机模式启动,否则按集群模式启动,这里只分析集群 ...