/*
 * 该程序是练习read(),write(),open(),create(),close(),lseek()等函数。
 *
 * 该程序的处理思路:
 *  1: 在程序所在的目录去打开一个文件,如果该文件不存在,则创建他。
 *  2:然后读取/etc/passwd文件的内容,并将内容写入打开的文件。
 *  3:关闭/etc/passwd文件和目的文件
 * */
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define BUFFER_SIZE 1024

int main(int argc, char ** argv)
{
    char chErrMsg[BUFFER_SIZE] = {0};
    sprintf(chErrMsg,"process begin @ [%p]\n",(void*)&main);
    
    write(STDOUT_FILENO,chErrMsg,strlen(chErrMsg));    //向标准输出终端中输出提示信息。
    //printf("%s",chErrMsg);    write和printf同时使用的时候,打印到终端上的日志信息有可能和程序的处理顺序不一致。原因,大概是write没有缓存,printf有缓存。
    
    int nSrcPasswd = open("/etc/passwd", O_RDONLY);    //以只读模式打开 /etc/passwd 文件。
    
    if(nSrcPasswd <= 0)
    {
        sprintf(chErrMsg,"%s","can not open file [/etc/passwd]\n");
        write(STDERR_FILENO,chErrMsg, strlen(chErrMsg));    //向标准错误终端中输出提示信息。
        
        return -1;
    }
    else
    {
        sprintf(chErrMsg,"%s","open file [/etc/passwd]...\n");
        write(STDOUT_FILENO,chErrMsg,strlen(chErrMsg));
    }
    
    char chOutFileName[256] = {0};
    sprintf(chOutFileName,"%s","file.out");
    
    int nDestFile = open(chOutFileName,O_WRONLY|O_APPEND);    //以写和追加模式打开文件 file.out
    if(nDestFile <= 0)
    {
        sprintf(chErrMsg,"%s","can not open file [file.out]. try to create it.\n");
        write(STDERR_FILENO,chErrMsg, strlen(chErrMsg));
        
        nDestFile = creat(chOutFileName,S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);    //创建一个新文件
        
        if(nDestFile <= 0)
        {
            sprintf(chErrMsg,"%s","can not creat file [file.out].\n");
            write(STDERR_FILENO,chErrMsg, strlen(chErrMsg));
        
            close(nSrcPasswd);
            
            return -2;
        }
    }
    
    int size = 0;
    char chBuffer[BUFFER_SIZE + 1] = {0};
    while((size = read(nSrcPasswd, chBuffer, BUFFER_SIZE)) >  0)    //从文件中读取 1024 个信息到chBuffer中
    {
        sprintf(chErrMsg,"%s","\n===========================\n");
        write(STDOUT_FILENO,chErrMsg,strlen(chErrMsg));
        write(STDOUT_FILENO,chBuffer,strlen(chBuffer));    //将信息写入标准输出终端
        
        if((size = write(nDestFile,chBuffer,strlen(chBuffer))) != size)    //将信息写入目标文件
        {
            sprintf(chErrMsg,"%s","can not write msg to dest file\n");
            write(STDOUT_FILENO,chErrMsg,strlen(chErrMsg));
            
            close(nDestFile);
            close(nSrcPasswd);
            
            break;
        }
        
        memset(chBuffer,0x00,sizeof(chBuffer));
    }

sprintf(chErrMsg,"%s","\n===========after seek set================\n");
    write(STDOUT_FILENO,chErrMsg,strlen(chErrMsg));
    lseek(nSrcPasswd,BUFFER_SIZE,SEEK_SET);    //重新设定文件内容指示符的偏移量
    if((size = read(nSrcPasswd,chBuffer,BUFFER_SIZE)) > 0)
    {
        write(STDOUT_FILENO,chBuffer,strlen(chBuffer));
    }
    
    close(nDestFile);    //关闭文件
    close(nSrcPasswd);
    
    return 0;
}

使用open_read_write等底层函数来赋值一个文件的更多相关文章

  1. PHP通过copy()函数来复制一个文件

    PHP通过copy()函数来复制一个文件.用法如下: bool copy(string $source, string $dest) 其中$source是源文件的路径,$dest是目的文件的路径.函数 ...

  2. 一个php函数,能够遍历一个文件夹下的所有文件和子文件夹

    <?phpfunction my_scandir($dir){    $files=array();    if(is_dir($dir))     {        if($handle=op ...

  3. VC如何得到一个文件夹的路径

    VC中没有现成的函数来选择一个文件夹,但这是经常会用到的,怎么办?自动动手,丰衣足食! 使用SHBrowseForFolder,代码如下: #include   int SelFolder(HWND ...

  4. C++(1)C++类四个默认函数---构造函数、析构函数、拷贝函数、赋值函数

    C++构造函数和析构函数 默认构造函数指不带参数或者所有参数都有缺省值的构造函数!!! (1)构造函数.析构函数与赋值函数 构造函数.析构函数与赋值函数是每个类最基本的函数.它们太普通以致让人容易麻痹 ...

  5. JavaScript在页面中的执行顺序(理解声明式函数与赋值式函数) 转载

    JavaScript在页面中的执行顺序 https://blog.csdn.net/superhoy/article/details/52946277 2016年10月27日 15:38:52 阅读数 ...

  6. Redis底层函数详解

    Redis底层函数详解 serverCron 函数 它负责管理服务器的资源,并维持服务器的正常运行.在执行 serverCron 函数的过程中会调用相关的子函数,如 trackOperationsPe ...

  7. Entity Framework 6 Recipes 2nd Edition(11-6)译 -> 从一个”模型定义”函数里返回一个复杂类型

    11-6.从一个”模型定义”函数里返回一个复杂类型 问题 想要从一个”模型定义”函数返回一个复杂类型 解决方案 假设我们有一个病人(patient)和他们访客(visit)的模型,如 Figure 1 ...

  8. Java-集合(没做出来)第四题 (List)写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列。 例如: List list = new ArrayList(); list.add(“Hello”); list.add(“World”); list.add(“Learn”); //此时list 为Hello World Learn reverseL

    没做出来 第四题 (List)写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列. 例如: List list = new ArrayList(); list.a ...

  9. 字串符相关 split() 字串符分隔 substring() 提取字符串 substr()提取指定数目的字符 parseInt() 函数可解析一个字符串,并返回一个整数。

    split() 方法将字符串分割为字符串数组,并返回此数组. stringObject.split(separator,limit) 我们将按照不同的方式来分割字符串: 使用指定符号分割字符串,代码如 ...

随机推荐

  1. 源码编译搭建LAMP

    环境版本信息: RHEL 5.3 Apache / 2.4.16 PHP / 5.4.45 mysql-5.5.45 源代码编译 安装方式 1: configure 配置 以及定制我们的软件包 2: ...

  2. PAT 天梯赛 L1-028. 判断素数 【水】

    题目链接 https://www.patest.cn/contests/gplt/L1-028 AC代码 #include <iostream> #include <cstdio&g ...

  3. 转:C语言嵌入式系统编程之软件架构篇

    http://blog.csdn.net/ce123_zhouwei/article/details/6978672

  4. 每天一个Linux命令(44)crontab命令

        crontab命令被用来提交和管理用户需要周期性执行的任务,与windows下的计划任务类似.     (1)用法:     用法: crontab  [-u user]  file cron ...

  5. Nginx负载均衡案例

    nginx负载均衡配置,windows版本和linux版本的nginx除了启动方式其他基本无差异. 1.Niginx安装 参考:https://www.cnblogs.com/zwcry/p/9454 ...

  6. Spring session共享(使用redis)

    SpringBoot+Redis实现HttpSession共享 前提:需要使用redis做session存储 一.效果演练(这里使用SpringBoot工程,Spring同理) 1.一个工程使用两个端 ...

  7. php数组函数-array_rand()

    array_rand()函数返回数组中的一个随机键名,或者如果指定函数返回键名不止一个,则返 回一个包含随机键名的数组. array_rand(array,number); array:必需.规定数组 ...

  8. Python mysql表数据和json格式的相互转换

    功能: 1.Python 脚本将mysql表数据转换成json格式 2.Python 脚本将json数据转成SQL插入数据库 表数据: SQL查询:SELECT id,NAME,LOCAL,mobil ...

  9. 20145240 《Java程序设计》第四次实验报告

    20145240 <Java程序设计>第四次实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1452 指导教师:娄嘉鹏 实验日期:2016.04.26 实验 ...

  10. 堆栈在linux内存中的使用

    链接:https://www.zhihu.com/question/57013926/answer/151506606 1.Linux 内核中使用 task_struct 作为进程描述符,该结构定义在 ...