Linux_1_文件—文件和目录操作

* 库函数和系统调用的区别在于系统调用能够让你直接访问Linux内核提供的服务,比如前面学到的read、write函数就是基于系统调用的函数。
* 系统调用函数存在与内核空间,库函数都是用户模式,所以系统调用不当可能会破坏系统,但库函数调用风险就要小很多。
* 库函数堆I/O操作进行缓冲,减少了系统调用开销,同时可移植行也更好。



* 打开和关闭文件

FILE *p fopen(const char *path,const char *mode);
int fclose(FILE *stream);

* fopen以mode模式打开名为path的文件
* fopen返回一个文件指针
* 出现错误,fopen返回NULL,并把errno设置为恰当值。



* 参数 mode 指向一个字符串,以下列序列之一开始 (序列之后可以有附加的字符):

   r      打开文本文件,用于读。流被定位于文件的开始。
   r+     打开文本文件,用于读写。流被定位于文件的开始。
   w      将文件长度截断为零,或者创建文本文件,用于写。流被定位于文件的开始。
   w+     打开文件,用于读写。如果文件不存在就创建它,否则将截断它。流被定位于文件的开始。
   a      打开文件,用于追加 (在文件尾写)。如果文件不存在就创建它。流被定位于文件的末尾。
   a+     打开文件,用于追加(在文件尾写)。如果文件不存在就创建它。读文件的初始位置是文件的开始,但是输出总是被追加到文件的末尾。

* 如果把Linux中二进制文件转到Windows上需要更改参数,在后面加一个b

“rb”
打开一个用于读取的二进制文件
“wb”
创建一个用于写入的二进制文件
“ab”
附加到一个二进制文件
“rb+”
打开一个用于读/写的二进制文件
“wb+”
创建一个用于读/写的二进制文件
“ab+”
打开一个用于读/写的二进制文件

* 读写文件

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);

* 参数pty指向缓冲区保存或读取的数据
* 参数size控制记录大小,每次读取数据的大小
* 参数nmemb为记录数
* 函数返回读取或回写的记录数,1/0



* fread函数分析
FILE *p=fopen("a.txt","r+");
if(p==NULL)
{
    printf("error is %s",strerror(errno));
}
else
{
printf("SUCCESS\n");
char buf[100];
memset(buf,0,sizeof(buf));
size_t rc=fread(buf,sizeof(buf),1,p);//1是记录数,可以是2、3、4、5...
                    //可以这样理解,我每次读取一条记录,这条记录的大小是sizeof(buf)
while(1)
{
    size_t tmp=fread(buf,1,10,p);//第二个参数表示每次读取记录的大小,读一个字节
                                            //第三个参数表示每次读取多少记录行,读10个记录行
                                            //返回的是每次读取的记录行,到文件最后没有把10行记录行读满,则返回所读的记录行
    rc+=tmp;
if(tmp== 0)
    break;
}


fclose(p);
}

二进制读取文件

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
struct person
{
     int id;
     char name[20];
     int age;
     int sex;
     char tel[20];
};
int Write(void)
{
     char path[20] = "1.txt";
     FILE *p = fopen(path, "w");//在windows下读取二进制文件,则文件读写方式符为wb\rb
     if (p == NULL)
     {
          printf("error is %s", strerror(errno));
     }
     else
     {
          printf("SUCCESS\n");
          struct person MEN[20];
          memset(&MEN, 0, sizeof(MEN));
          MEN[0].age = 22;
          strcpy(MEN[0].name, "苍老师");
          MEN[0].age = 19;
          MEN[0].sex = 0;
          strcpy(MEN[0].tel, "100");
          MEN[1].age = 19;
          strcpy(MEN[1].name, "饭岛爱");
          MEN[1].age = 19;
          MEN[1].sex = 0;
          strcpy(MEN[1].tel, "101");
          fwrite(&MEN, sizeof(struct person), 2, p);
          fclose(p);
     }
     return 0;
}
int Read(void)
{
     char path[20] = "1.txt";
     FILE *p = fopen(path, "r");
     if (p == NULL)
     {
          printf("error is %s\n", strerror(errno));
     }
     else
     {
          printf("Read Success\n");
          struct person man;
          while (1)
          {
              size_t a = fread(&man, sizeof(struct person), 1, p);
              if (a == 0)
                   break;
              printf("名字:%s\n年龄:%d\n电话:%s\n", man.name, man.age,man.tel);
          }
          fclose(p);
     }
     return 0;
}
int main(void)
{
     Read();
     return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值