使用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]\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;
}