Linux应用层编程学习_1_标准IO之文件编程

Linux对文件的操作有两套接口(我认为的),一类是Linux系统提供给用户的系统调用接口,另一类是c库提供的函数接口。今天要学习和总结的是c库提供的这套接口。

***********************************************************************************************

 打开文件函数:

#include <stdio.h>

FILE *fopen(const char *path, const char *mode);

FILE *fdopen(int fd, const char *mode);

FILE *freopen(const char *path, const char *mode, FILE *stream);

解释:FILE *是一个文件流指针,用于指向文件。

           const char *path这个是指定要打开的文件的路径

           const char *mode这个是打开文件的权限。以什么方式打开文件,只读、只写、还是读写都可以。

**************************************************************************************************

关闭文件函数:

#include <stdio.h>

int fclose(FILE *stream);

解释:FILE *stream是要关闭的文件的文件流指针

*****************************************************************************************************

错误处理函数:

#include <stdio.h>

void perror(const char *s);

解释:const char *s这是当出现错误时,自己对这个错误的提示。

ps:如果出现错误,除了会提示自己定义的提示信息,还有系统根据出现的错误自己提示的错误。

#include <stdio.h>
int main()
{
    FILE *fd;
    if((fd = fopen("1.txt","r"))==NULL)
    {
    perror("no file");
    return -1;
    }
    fclose(fd);
    return 0;
}

这个在测试的时候,我没有创建1.txt,提示的信息如下:

刚开始我以为系统是根据return -X中X的值而改变的。进过测试,不是。

然后我创建了1.txt,但是我让1.txt的权限改为了000,不能读写操作。运行出现以下情况:

这样我知道了,系统是根据程序运行的错误,自动给出的错误信息。

 

#include <string.h>

char *strerror(int errnum);

解释:int errnum是错误码,自己定义一个int型的变量,然后系统会把错误的错误码自动存入这个变量中。

该函数返回的将是一个字符串,可以直接用printf("%s",strerror(errno))。打印。

******************************************************************************************************************

这两个函数是按字符读取和写入的,每次一个字符

#include <stdio.h>

int fgetc(FILE *stream);

解释:FILE *stream是要读取的文件的文件流指针

返回值是读到的字符

#include <stdio.h>

int fputc(int c, FILE *stream);

解释:int c是输出的字符。

 

*********************************************************************************************************************

按行输入输出

#include <stdio.h>

char *fgets(char *s, int size, FILE *stream);

解释:char *s输入字符串的缓冲区的首地址。

           int size输入的字符串的长度。

           FILE *stream要写入的文件流指针。

         

#include <stdio.h>

int fputs(const char *s, FILE *stream);

解释:const char *s输出字符串的缓冲区的首地址

           FILE *stream要读入的文件流指针。

 

 

********************************************************************************************

指定大小的读写文件

#include <stdio.h>

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);

解释:void *ptr用于存放读出的字符串

          size_t size是每块的大小

          size_t nmemb表示有多少块

          FILE *stream要读取的文件流

*********************************************************************************************************************

定位函数

 #include <stdio.h>

       int fseek(FILE *stream, long offset, int whence);//

       long ftell(FILE *stream);//返回文件当前的读写指针的位置

解释:

FILE *stream是要定位的文件流指针

long offset是相对于基准值的偏移量

int whence是指定基准值。

SEEK_SET 代表文件的起始位置

SEEK_END代表文件的结束位置

SEEK_CUR代表当前读写位置

 

**********************************************************************************************************************

实验练习1:文件的复制

#include <stdio.h>
#define N 64
int main(int argc,char *argv[])
{
    int n;
    char buf[N];
    FILE *fd_r;
    FILE *fd_w;

    if(argc != 3)
    {
    printf("palse shurugrshi : %s<file1><mudi_file>",argv[0]);
    return -1;
    }

    if((fd_r = fopen(argv[1],"r"))==NULL)
    {
    printf("open file_r err");
    return -1;
    }
    if((fd_w = fopen(argv[2],"a"))==NULL)
    {
    printf("open file_w err");
    return -1
    }
    
   while((n=fread(buf, 64, 1, fd_r))>0)
   {
    if((fwrite(buf, n, 1,fd_w))!=n)
    {
        printf("write err");
        return -1;
    }
   }
    if((fclose(fd_r))!=0)
    {
    printf("close file_read err");
        return -1;
    }
    if((fclose(fd_w))!=0)
    {
    printf("close file_write err");
    return -1;
    }
    return 0;
}

总结一下:在写打开函数的时候,出现了段错误,在找到错误后,发现自己犯了一个很低级的错误

#include <stdio.h>

int main(int argc,char *argv[])
{

    printf("%d\n",argv[1]);

    return 0;
}

打印出来的是一个地址,说明在使用fopen的时候我在参数的地方给argv[1]加了双引号。。。。。。。。。。。。。。

**********************************************************************************************************************************

实验练习2:循环记录系统时间

获取系统时间函数:

#include <time.h>

time_t time(time_t *tloc);

转化为本地址时间函数:

#include <time.h>

char *ctime(const time_t *timep);

 

 

#include <stdio.h>
#include <time.h>
#include <unistd.h>

int main(int argc,char *argv[])
{
    FILE *fd;
    time_t t;

    if((fopen(argv[1], "w"))==NULL)
    {
    printf("open file err");
    return -1;
    }
    while(1)
    {
    time(&t);
    fprintf(fd,"%s\n",ctime(&t));
    sleep(1);
    printf("%s\n",ctime(&t));

    }
    fclose(fd);
    return 0;
}

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值