/*
 * 该程序是练习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. ThinkPHP框架基础知识一

    ThinkPHP是一个快速.兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,遵循Apache2开源协议发布,从Struts结构移植过来 ...

  2. VC中添加消息响应函数

    1. 添加消息映射 2. 头文件中添加函数声明 3. 实现文件中添加函数定义

  3. SpringCloud Bus消息总线

    在微服务架构中,通常会使用轻量级的消息代理来构建一个共用的消息主题来连接各个微服务实例,它广播的消息会被所有在注册中心的微服务实例监听和消费,也称消息总线. SpringCloud中也有对应的解决方案 ...

  4. [转载]allowTransparency属性

    原文地址:allowTransparency属性作者:惊寒唱晚 IE5.5开始支持浮动框架的内容透明.如果想要为浮动框架定义透明内容,则必须满足下列条件. 1.与 iframe 元素一起使用的 all ...

  5. 浅谈CDN技术的性能与优势

    从淘宝架构中的CDN入手分析 使用CDN和反向代理提高网站性能.由于淘宝的服务器不能分布在国内的每个地方,所以不同地区的用户访问需要通过互联路由器经过不同长度的路径来访问服务器,返回路径也一样,所以数 ...

  6. JavaScript -- 广告随鼠标移动, 点击一次后关闭

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. JAVA 中的集合框架

    java集合框架提供了一套性能优良.使用方便的接口和类,它们位于java.util包中 一.集合与数组 数组:(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知 ...

  8. Java编程思想 两个主函数

    //: initialization/DynamicArray.javapackage initialization; /* Added by Eclipse.py */// Array initia ...

  9. EJS基本用法

    1.引入 <script src="/src/ejs_production.js"></script> 2.模板 <script id="c ...

  10. review29

    数组流 流的源和目的地除了可以是文件外,还可以是计算机内存. 1.字节数组流 字节数组输入流ByteArrayInputStream和字节数组输出流ByteArrayOutputStream分别使用字 ...