2020/4/7 stat() fgets() rewind()

表头文件:    #include <sys/stat.h>
                   #include <unistd.h>
定义函数:    int stat(const char *file_name, struct stat *buf);
函数说明:    通过文件名file_name获取文件信息,并保存在buf所指的结构体stat中
返回值:       执行成功则返回0,失败返回-1,错误代码存于errno

错误代码:
    ENOENT         参数file_name指定的文件不存在
    ENOTDIR        路径中的目录存在但却非真正的目录
    ELOOP          欲打开的文件有过多符号连接问题,上限为16符号连接
    EFAULT         参数buf为无效指针,指向无法存在的内存空间
    EACCESS        存取文件时被拒绝
    ENOMEM         核心内存不足
    ENAMETOOLONG   参数file_name的路径名称太长

buf所指的结构体:

struct stat {
    dev_t                                  st_dev;            //文件的设备编号
    ino_t                                   st_ino;             //节点
    mode_t                              st_mode;         //文件的类型和存取的权限
    nlink_t                                st_nlink;          //连到该文件的硬连接数目,刚建立的文件值为1
    uid_t                                  st_uid;             //用户ID
    gid_t                                  st_gid;            //组ID
    dev_t                                 st_rdev;          //(设备类型)若此文件为设备文件,则为其设备编号
    off_t                                   st_size;           //文件字节数(文件大小)
    unsigned long                   st_blksize;       //块大小(文件系统的I/O 缓冲区大小)
    unsigned long                   st_blocks;        //块数
    time_t                               st_atime;          //最后一次访问时间
    time_t                               st_mtime;         //最后一次修改时间
    time_t                               st_ctime           //最后一次改变时间(指属性)
};

在POSIX中定义了检查这些类型的宏定义:                是 :返回 1         不是 :返回 0
    S_ISLNK (st_mode)    判断是否为符号连接
    S_ISREG (st_mode)    是否为一般文件 
    S_ISDIR (st_mode)    是否为目录
    S_ISCHR (st_mode)    是否为字符装置文件
    S_ISBLK (s3e)        是否为先进先出
    S_ISSOCK (st_mode)   是否为socket

https://blog.csdn.net/tigerjibo/article/details/11695763?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3

 

 

 

    原型  char *  fgets(char * s, int n,FILE *stream);

    参数:

         s: 字符型指针,指向存储读入数据的缓冲区的地址。

         n: 从流中读入n-1个字符

         stream : 指向读取的流。

   返回值:

          1. 当n<=0 时返回NULL,即空指针。

          2. 当n=1 时,返回空串"".

          3. 如果读入成功,则返回缓冲区的地址。

          4. 如果读入错误或遇到文件结尾(EOF),则返回NULL.

 

fgets(..)读入数据时,先定义一个字符数组或字符指针,如果定义了字符指针 ,那么一定要初始化。

              char s[100]; //可以。

              char *s;  //不可以,因为只是声明了一个指针。但并没有为它分配内存缓冲区。

        所以,如果要用指针,则  char *s=(char *)malloc(100*sizeof(char)); 为其分配内存空间,c++中用char *s=new char [100];      如果为分配内存空间,编译时不会检查出问题,但运行时会出现未知错误。

 

fgets(...)读入文本行时的两种情况。

          1.如果n大于一行的字符串长度,那么当读到字符串末尾的换行符时,fgets(..)会返回。并且在s的最后插入字符串结束标志'\0'。 而s缓冲区剩余的位置不会再填充。

           example:

              123abc

              fgets(s,10,fp);

              此时,读入七个字符,123abc\n,实际上还有最后的'\0',所以,strlen(s)=7; 如果要去除末尾的\n,s[strlen(s)-1]='\0';便可。

          2.如果n小于等于一行的字符串的长度,那么读入n-1个字符,此时并没有读入\n因为并没有到行尾 ,同样在最后会插入'\0'.

          example:

            123abc

            char  s[5];

            fgets(s,5,fp);

            这时读入4个字符,123a,并没有换行符,所以strlen(s)=4.
 

 fgets(...)读入整个文件内容

          通常用while()循环来使fges()读入文本全部内容,并按行读入。

https://blog.csdn.net/daiyutage/article/details/8540932?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2

 

 

 

 

函数名: rewind()

功 能: 将文件内部的位置指针重新指向一个流(数据流/文件)的开头

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值