/*
 * 该程序是练习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. HibernateQL

    查询语言---QL(Query Language)   NativeSQL-------功能最强大 HQL--Hibernate QL EJB QL (JP QL)---HQL的一个子集 QBC--- ...

  2. Linux文件系统管理 常见命令df、du、fsck、dumpe2fs

    概述 Linux文件系统管理 常见命令df.du.fsck.dumpe2fs. 文件系统查看命令:df 通过 df 命令可以査看已经挂载的文件系统的信息包括设备文件名.文件系统总大小.已经使用的大小. ...

  3. Python Streaming实战2: Join的实现与数据过滤

    Hadoop Join 与 Not In的实现  (一)源数据与要实现的查询 1. 要实现的查询 select a.sid ,a.name ,b.course ,b.score from Studen ...

  4. CentOS 7卸载mariadb安装mysql

    CentOS 7已经将默认集成mariadb而不是mysql,这对于多数还是依赖于mysql的应用来说,需要手动的进行更新. 可能会遇到这样错误,换成MySQL就好了. error 2002 (hy0 ...

  5. c++ boost库学习二:内存管理->智能指针

    写过C++的人都知道申请和释放内存组合new/delete,但同时很多人也会在写程序的时候忘记释放内存导致内存泄漏.如下所示: int _tmain(int argc, _TCHAR* argv[]) ...

  6. DBUtiles中的简单使用(QueryRunner和ResultSetHandler的手动实现)

    DBUtiles是一个很好的处理JDBC的工具类.(DbUtils is a small set of classes designed to make working with JDBC easie ...

  7. HDU 2603 二分匹配

    #include <queue>#include <vector>#include <cstdio>#include <cstring>#include ...

  8. 实现HTML格式的数据报表邮件

  9. java基础(6)-集合类2

    泛型 泛型:是一种把类型明确的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型,参数化类型,把类型当做参数一样的传递 好处: 1)把运行时期的问题提前到了编译器期间 2)避免了强制类型转换 3 ...

  10. Elasticsearch安装笔记

    下载安装包 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.2.zip 开始执行bin/./el ...