/*
 * 该程序是练习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. python中的逻辑操作符

    python中主要有三个逻辑操作符,分别是:and.or.not. and:且,所有人为真才为真. or:或,一个为正就是真. not:非,取反. >>> print(3>2 ...

  2. iframe与父窗口之间数据互相获取

    Js/Jquery获取iframe中的元素 博客分类: jquery javascript jquery  在web开发中,经常会用到iframe,难免会碰到需要在父窗口中使用iframe中的元素.或 ...

  3. formatblock 块及

    有标签,执行标签替换,只是替换标签,属性不改变. 在无标签外部添加标签

  4. val() attr('value')

    val() 只能更改输入框内的值,能更改value属性, 在浏览器中体现不出value被改变 attr('value') 都可以 谷歌浏览器 val,attr都能获取输入框最新的value值

  5. LeetCode 14. Longest Common Prefix字典树 trie树 学习之 公共前缀字符串

    所有字符串的公共前缀最长字符串 特点:(1)公共所有字符串前缀 (好像跟没说一样...) (2)在字典树中特点:任意从根节点触发遇见第一个分支为止的字符集合即为目标串 参考问题:https://lee ...

  6. springboot-controller的使用

    获取url中的数据: @RestController public class HelloController { @RequestMapping(value="/say/{id}" ...

  7. nodejs爬虫selenium

    6.元素操作 查找元素 使用操作如何找到页面元素Webdriver的findElement方法可以用来找到页面的某个元素,最常用的方法是用id和name查找.下面介绍几种比较常用的方法. By ID假 ...

  8. 生信概念之global alignment VS local alignment

  9. vm+ubuntu联网

    在vm下刚装了ubuntu,就是上不了网,确认以下配置后方可以 1.我的电脑开机自动把VM的相关服务都关闭了,需要手动打开 在控制面板中搜索服务,手动启动vm服务 2.在适配器里启用vm网卡 3.使用 ...

  10. 一步一步粗谈linux文件系统(三)----超级块(superblock)【转】

    本文转载自:https://blog.csdn.net/fenglifeng1987/article/details/8302921 超级块是来描述整个文件系统信息的,可以说是一个全局的数据结构,可以 ...