Linux下C编程-----文件操作(1) 通过系统调用简单操作标准输入、标准输出、标准错误

Linux的 C系统调用操作  ,下面我们就来练习下 简单的系统调用操作

read系统调用测试

/*************************************************************************
	> File Name: read.c
	> Author: 
	> Mail: 
	> Created Time: Tue 10 Feb 2015 01:23:58 AM PST
 ************************************************************************/

#include<stdio.h>
#include<unistd.h>
#include<errno.h>
//利用管道测试程序的标准输入
//echo  hello world | ./read
// ./read < a.txt 
int main()
{
    char buf[128] ;
    int len ;
    //从输入流读取数据进入到buffer 如果返回-1 那么说明读取错误
    if((len=read(0,buf,128))==-1)
    { 
        //错误写入标准错误输出 
        write(2,"read error\n",11) ;
    }
    //将通过标准输入读取的数据通过标准输出输出到控制台 
    if(write(1,buf,len)!=len)
    {   
        //如果输出的长度不等于 len 说明 IO错误 
        write(2,"read error\n",11) ;
    }
    exit(0);
    return 0 ;
}
  


write系统调用测试

/*************************************************************************
	> File Name: write.c
	> Author: 
	> Mail: 
	> Created Time: Tue 10 Feb 2015 12:39:05 AM PST
 ************************************************************************/

#include<stdio.h>
//Linux和 Uninx有关与系统调用的封装
#include<unistd.h>
//errno系统最后一次错误
#include<errno.h>
//通过自动打开文件句柄 1  也就是标准输出进行字符串输出 
int main()
{ 
    if(write(1,"hello,world\n",2)!=12)
    {
        write(2,"write error!\n",13) ;
    }
   printf("ErrorNo:%d\n",errno);
   exit(0) ;
}

open系统调用测试1

/*************************************************************************
	> File Name: open.c
	> Author: 
	> Mail: 
	> Created Time: Tue 10 Feb 2015 02:07:54 AM PST
 ************************************************************************/

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <stdlib.h> 
int main()
{
    char*filein="./in.txt" ;
    char*fileout="./out.txt" ;
    int fdin,fdout ;
    char rdChar ; 
    //以只读方式打开输入文件 
    if((fdin=open(filein,O_RDONLY))==-1)
    {   
        write(2,"OpenError!\n",11)  ;
        return 0 ;
    }
    //打开文件 文件不存在并且创建文件文件存在 会 清空文件  并且复给 文件所有者读写权限 
    if((fdout=open(fileout,O_CREAT|O_WRONLY|O_TRUNC,S_IRUSR|S_IWUSR))==-1)
    {  
        //error
        write(2,"OpenError!\n",11);
        return 0 ;
    }
    //通过系统调用进行文件复制
    while(read(fdin,&rdChar,1)==1)
    {
        write(fdout,&rdChar,1) ;
    }exit(0)
    return  0 ;
}

open系统调用测试2

#include<stdio.h>
#include<unistd.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/types.h>
int main()
{
    int fdin,fdout,len ;
    char buf[10] ;
    fdin=open("./in.txt",O_RDONLY); 
    fdout=open("./out.out",O_WRONLY|O_TRUNC|O_CREAT,S_IRUSR|S_IWUSR) ; 
    //效率比较高的写法  尽量少调用系统调用
    while((len=read(fdin,buf,10))>0)
    {
        write(fdout,buf,len) ;
    }
    return 0 ;

lseek系统调用测试

/*************************************************************************
	> File Name: lseek.c
	> Author: 
	> Mail: 
	> Created Time: Tue 10 Feb 2015 05:02:51 AM PST
 ************************************************************************/

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h> 
#define STD_INPUT 0
#define STD_OUTPUT 1
#define STD_ERROR 2
//函数读取用户输出的第二个和倒数第二个字符 输入字符串大于5
int main()
{  
    char input[256] ;
    int rdLen,wLen ;
    int fdwrite,fdread;
    char rdChar;
    rdLen=read(STD_INPUT,input,256);
    if(rdLen==-1)
    {
        write(STD_ERROR,"error\n",6);
        exit(0);
    }
    if((fdwrite=open("./res.txt",O_CREAT|O_TRUNC|O_WRONLY,S_IRUSR|S_IWUSR))==-1)
    {
        write(STD_ERROR,"create file error",17);
        exit(0) ;
    }
    wLen=write(fdwrite,input,rdLen); 
    if(wLen==-1)
       exit(0);
    close(fdwrite) ;
    if((fdread=open("./res.txt",O_RDONLY))==-1)
       exit(0);
    lseek(fdread,1,SEEK_SET);
    read(fdread,&rdChar,1) ;
    printf("Index2:%c\n",rdChar);
    lseek(fdread,-3,SEEK_END) ;
    read(fdread,&rdChar,1);
    printf("Index-2:%c\n",rdChar);
    close(fdread) ;
    return 0 ;
}


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。