/*
 * 该程序是练习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. $.messager.confirm修改弹出框按钮提示文字

    $.messager.confirm 默认提示语为“OK”和“Cancel”.引入中文控件后变为“确定”和“取消” <script src="../js/locale/easyui-l ...

  2. iOS UIFont 的学习与使用

    通常,我们使用字体 都是系统默认的字体. 有时候 从阅读体验,美观度 设计师都会考虑用一些 更高大尚的字体. 系统字体库 给英文 各种style的发挥空间很大,但是 中文则不然. 但是苹果 给使用中文 ...

  3. MQ,互联网架构解耦神器

    一个架构常识:当调用方需要关心执行结果,通常使用RPC调用. ret = PassportService::userAuth(name, pass); switch(ret){  case(YES) ...

  4. Linux yum源码包安装和卸载

    Linux 下的绝大多数源码包都是用 C 语言编写的,还有少部分是用 C++ 等其他程序语言编写的.所以,要想安装源码包,必须安装 C 语言编译器 gcc(如果是用 C++ 编写的程序,则还需要安装 ...

  5. [转]GStreamer资料(摄像头采集,视频保存,远程监控)DVR

    http://blog.csdn.net/wzwxiaozheng/archive/2010/12/26/6099397.aspx GStreamer资料整理(包括摄像头采集,视频保存,远程监控,流媒 ...

  6. 《机器学习实战-KNN》—如何在cmd命令提示符下运行numpy和matplotlib

    问题背景:好吧,文章标题是瞎取得.平常用cmd运行python代码问题不大,我在学习<机器学习实战>这本书时,发现cmd无法运行import numpy as np以及import mat ...

  7. [Android]开源中国源码分析之二---DrawerLayout

    从启动界面到主界面之后的效果如图所示,采用的是v4包下的DrawerLayout, activity_main.xml文件如下: <!-- A DrawerLayout is intended ...

  8. mysql删除重复记录

    Solution 1: Add Unique Index on your table: ALTER IGNORE TABLE `TableA` ADD UNIQUE INDEX (`member_id ...

  9. jqgrid的scroll参数的使用

    scroll参数会影响addJSONData(data)方法的使用 存在scroll参数,addJSONData方法会往表格中追加数据: 不存在scroll参数时,addJSONData方法会覆盖表格 ...

  10. 键盘高级操作技巧【TLCL】

    Ctrl-a     移动光标到行首. Ctrl-e     移动光标到行尾. Ctrl-f     光标前移一个字符:和右箭头作用一样. Ctrl-b     光标后移一个字符:和左箭头作用一样. ...