zoukankan      html  css  js  c++  java
  • 使用open_read_write等底层函数来赋值一个文件

    /*
     * 该程序是练习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] ",(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] ");
            write(STDERR_FILENO,chErrMsg, strlen(chErrMsg));    //向标准错误终端中输出提示信息。
            
            return -1;
        }
        else
        {
            sprintf(chErrMsg,"%s","open file [/etc/passwd]... ");
            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. ");
            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]. ");
                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"," =========================== ");
            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 ");
                write(STDOUT_FILENO,chErrMsg,strlen(chErrMsg));
                
                close(nDestFile);
                close(nSrcPasswd);
                
                break;
            }
            
            memset(chBuffer,0x00,sizeof(chBuffer));
        }

        sprintf(chErrMsg,"%s"," ===========after seek set================ ");
        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;
    }

  • 相关阅读:
    去逛了一下浙东大峡谷
    终于开始释然
    其实在天堂AS IT IN HEAVEN
    寝室全景照
    黑与白
    努力下的意外
    文曲星的存在意义
    强烈推荐文章,给那些头脑发晕的看看
    学友演唱会
    最喜欢的歌
  • 原文地址:https://www.cnblogs.com/babyha/p/5201360.html
Copyright © 2011-2022 走看看