Linux 文件管理(C语言库函数一)

        系统调用函数能够直接操作系统设备,C语言库函数是对系统调用函数的封装,增加了可移植性,
C语言库函数可以在各个系统上运行,而系统调用则会因为系统不同而有一定的差别。 在读写文件这个操作上,系统函数每次都会调用系统设备进行读写,但是C语言库函数则做了一定的优化,
C语言库函数提供了一个缓冲区,只有当缓冲区满了才会调用系统设备读写文件,保护了磁盘,减少系统消耗。 但是在读取键盘文件的方法上,系统调用使用的是read()函数,而C语言可以函数使用的是scanf(),fscanf()函数,
C语言的scanf()函数存在弊端(无法读取空格,不能按缓冲区大小读取),所以推荐使用系统调用。

 

打开和关闭文件
FILE * fopen(const char *path,const char *mode);
int fclose(FILE *stream)
fopen以mode模式打开名为path的文件
fopen返回一个文件指针
出现错误,fopen返回NULL,并把errno设置为恰当的值

mode模式说明
"r":以读的方式打开文件,文件流的位置在文件的开始。
"r+":以读写的方式打开文件,文件流的位置在文件的开始。
"w":如果文件存在,截断这个文件,让文件的大小变为0,文件流的位置在文件的开始。
"w+":以读写的方式打开文件,如果文件不存在,建立该文件,如果文件存在就截断文件,文件流的位置在文件的开始。
"a":以追加的方式打开文件,在文件的末尾开始写,如果文件不存在,创建该文件,文件流的位置在文件的末尾。
"a+":以读写的方式打开文件(如果是写文件,在文件的末尾开始写),如果文件不存在,创建该文件;从文件头开始读文件,但是在文件尾部追加文件。
备注:在Linux系统环境下,读写二进制文件或者文本文件只有这6种mode模式,
但是在windows系统环境下,读写文本文件是这6种模式,读写二进制文件则必须要加上'b',例如"rb"--读二进制文件

 

size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream)
size_t fwrite(void *ptr,size_t size,size_t nmemb,FILE *stream)
参数ptr指向缓冲区保存或读取的数据
参数size表示单个记录大小
参数nmemb最大允许读取或回写的记录数
函数返回值是已经读取或回写的记录数

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

typedef struct _person
{
    int num;
    char name[30];
    int age;
} Person;

int main(int arg, char * args[])
{
    if (arg < 2)
    {
        printf("请输入一个参数!\n");
        return 0;
    }
    //open the file
    FILE * pf = NULL;
    //open the file in write mode
    pf = fopen(args[1], "w");
    //judge file pointer
    if (pf == NULL)
    {
        /*
         注意:这里和系统函数read有所区别,系统read函数返回的是int型文件标识符
         而C语言库函数返回的是FILE结构体指针
         系统read函数判断文件标识符是否是-1
         C语言库函数fread判断返回的文件指针是否为NULL
         */
        printf("error msg:%s\n", strerror(errno));
        return 0;
    }
    /*
     fread()和fwrite()一般用于二进制文件的读写
     */

    //size_t类型相当于unsigned int(无符号整型)
    size_t rc=0;
    //define person object
    //Initialization
    Person arr[3];
    memset(&arr, 0, sizeof(arr));
    arr[0].num = 1;
    strcpy(arr[0].name, "ming");
    arr[0].age = 12;

    arr[1].num = 2;
    strcpy(arr[1].name, "hong");
    arr[1].age = 13;

    arr[2].num = 3;
    strcpy(arr[2].name, "fei");
    arr[2].age = 14;

    rc= fwrite(arr,sizeof(Person),3,pf);
    //print record count
    printf("record count:%d\n",rc);
    //close file pointer
    fclose(pf);
    return 0;
}

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

typedef struct _person
{
    int num;
    char name[30];
    int age;
} Person;

int main(int arg, char * args[])
{
    if (arg < 2)
    {
        printf("请输入一个参数!\n");
        return 0;
    }
    //open the file
    FILE * pf = NULL;
    //open the file in read mode
    pf = fopen(args[1], "r");
    //judge file pointer
    if (pf == NULL)
    {

        printf("error msg:%s\n", strerror(errno));
        return 0;
    }
    size_t rc=0;
    int i=0;
    Person arr[3];
    memset(&arr,0,sizeof(arr));
    rc= fread(arr,sizeof(Person),3,pf);
    //print record count
    printf("record count:%d\n",rc);
    for(;i<3;i++)
    {
        printf("num=%d\n",arr[i].num);
        printf("name=%s\n",arr[i].name);
        printf("age=%d\n",arr[i].age);
    }
    //close file pointer
    fclose(pf);
    return 0;
}

 

格式化输入和输出调用
int fprintf(FILE * stream,const char *format,...)
int fscanf(FILE * stream,const char *format,...)

 

//fprintf()函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

int main(int arg, char * args[])
{
    if (arg < 2)
    {
        printf("请输入一个参数!\n");
        return 0;
    }
    //open the file
    FILE * pf = NULL;
    //open the file in read mode
    pf = fopen(args[1], "w");
    //judge file pointer
    if (pf == NULL)
    {

        printf("error msg:%s\n", strerror(errno));
        return 0;
    }
    char buf[30]={0};
    int i=0;
    strcpy(buf,"fly on air");
    for(;i<10;i++)
    {
        fprintf(pf,"%s--num=%d\n",buf,i);
    }
    //close file pointer
    fclose(pf);
    return 0;
}

 

//fscanf()函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

int main(int arg, char * args[])
{
    if (arg < 2)
    {
        printf("请输入一个参数!\n");
        return 0;
    }
    //open the file
    FILE * pf = NULL;
    //open the file in read mode
    pf = fopen(args[1], "r");
    //judge file pointer
    if (pf == NULL)
    {

        printf("error msg:%s\n", strerror(errno));
        return 0;
    }
    char buf[10]={0};
    //EOF是一个常量,表示文件结尾
    /*
     scanf(),fscanf()两大缺点
     缺点一:遇到空格或者'\n'结束当前读取
     缺点二:不会考虑缓冲区的大小,读取的内容很可能超出缓冲区大小,导致报错
     */
    while(fscanf(pf,"%s",buf)!=EOF)
    {
        printf("%s\n",buf);
    }
    //close file pointer
    fclose(pf);
    return 0;
}

 

行输入和输出调用。
char *fgets(char *s, int size, FILE *stream);
int fputc(char *s, FILE *stream);
fgets从文件中读取一行,返回EOF代表文件结尾。
fputs向文件中写入一行

 

//fputs()函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

int main(int arg, char * args[])
{
    if (arg < 2)
    {
        printf("请输入一个参数!\n");
        return 0;
    }
    //open the file
    FILE * pf = NULL;
    //open the file in write mode
    pf = fopen(args[1], "w");
    //judge file pointer
    if (pf == NULL)
    {

        printf("error msg:%s\n", strerror(errno));
        return 0;
    }
    char buf[50]={0};
    sprintf(buf,"fly with me\n");
    fputs(buf,pf);
    //close file pointer
    fclose(pf);
    return 0;
}

 

//fgets()函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

int main(int arg, char * args[])
{
    if (arg < 2)
    {
        printf("请输入一个参数!\n");
        return 0;
    }
    //open the file
    FILE * pf = NULL;
    //open the file in read mode
    pf = fopen(args[1], "r");
    //judge file pointer
    if (pf == NULL)
    {

        printf("error msg:%s\n", strerror(errno));
        return 0;
    }
    char buf[50]={0};
    /*
     fgets()函数读到文件结尾会返回NULL,不是EOF

     */
    while(fgets(buf,sizeof(buf),pf)!=NULL)
    {
        /*
         fgets()会读出每一行的换行符'\n',所以读出来的数据不要加'\n'
         fscanf()不会读出'\n'
         */
        printf("%s",buf);
    }

    //close file pointer
    fclose(pf);
    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C语言库函数的实现源码可以在多个地方进行获取。 首先,你可以查看操作系统提供的标准C库源码。比如,对于Linux系统来说,它使用的是GNU C Library (glibc),其源码可以在GNU官方网站或Linux发行版的仓库中获得。 其次,你可以查看编译器的实现源码。大多数编译器会包含标准C库的实现源码。比如,GCC是一个开源编译器套件,包含大量常用库函数的实现源码。 另外,一些开源项目和网站也提供了常用库函数的实现源码。比如GitHub上有很多开源项目,如GNU Coreutils、BusyBox等,这些项目提供了很多常用库函数的实现源码。 最后,如果你想了解更底层的实现细节,你可以查看操作系统的源码。比如,Linux的内核源码提供了很多系统调用和库函数的底层实现,这些可以帮助你深入理解库函数的工作原理。 总的来说,C语言库函数的实现源码可以在操作系统的标准C库源码、编译器源码、开源项目以及操作系统源码中进行获取。 ### 回答2: C语言库函数的实现源码可以在不同的地方找到。 首先,C语言的标准库函数的实现源码通常是由C编译器厂商提供的。大多数C编译器都附带了标准库的源码,可以在编译器的安装目录下找到。例如,对于GNU GCC编译器,可以在其安装目录下的"lib"文件夹中找到相关的源码文件。 其次,C语言的开源实现,如GNU C库(glibc)以及其它一些开源库,也提供了标准库函数的实现源码。这些开源库的源码通常可以在它们的官方网站或代码托管平台上找到,如Github等。 另外,还可以通过在互联网上搜索特定库函数的实现源码来找到相关的资源。有许多社区和论坛上都有人分享了自己实现的库函数代码。 需要注意的是,虽然C语言标准库函数的实现源码可以找到,但这并不意味着我们可以直接修改它们。标准库函数的源码通常是经过优化和经过验证的,适用于各种平台和环境。如果有需要对标准库的行为进行扩展或修改,应当采用编写自定义函数的方式来实现。 ### 回答3: C语言库函数的实现源码可以在多个地方找到。 首先,可以查看C语言的标准库函数的实现源码。C标准库函数的实现源码通常是由编译器或操作系统提供的。例如,GNU C 编译器中的源码集合在GNU C 库(又称为glibc)中,可以在GNU官方网站或其他开源源码托管平台(如Github)上找到。此外,还有其他的一些标准C库的实现,如uclibc、newlib等。 其次,很多C语言库函数的实现源码也可以在开源软件项目或库中找到。许多常用的C库,如数据库访问库MySQL、图形库OpenGL、网络编程库libcurl等,都是开源的,并且提供了源码。你可以在它们的官方网站或开源源码托管平台上找到它们的源码。 最后,一些编程书籍或教程也会提供一些库函数的实现源码作为示例。这些源码通常会通过书籍附带的光盘或相关网站提供。 总之,C语言库函数的实现源码可以通过搜索相关的开源项目、编程书籍或教程来找到。通过查看这些源码可以更深入地了解库函数的实现原理,同时也可以借鉴和学习他人的代码实现方式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值