博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unix环境变量--文件操作
阅读量:2194 次
发布时间:2019-05-02

本文共 4483 字,大约阅读时间需要 14 分钟。

 一、文件操作:

头文件:#include
ssize_t pread (int filedes, void *buf, size_t nbytes, off_t offset );ssize_t pwrite (int filedes, const void *buf, size_t nbytes, off_t offset );成功:返回读到的字节数;出错:返回-1;到文件结尾:返回0作用:由于lseek和read/write 调用之间,内核可能会临时挂起进程,所以对同步问题造成了问题,调用pread/pwrite相当于顺序调用了lseek 和 read/write,这两个操作相当于一个捆绑的原子操作。
头文件:#include
mode_t umask(mode_t cmask);返回值:成功返回之前的屏蔽字作用:为进程创建文件模式屏蔽字,即创建的文件默认不再有cmask权限,除非主动调用chmod()函数修改
头文件:#include
#include
int truncate(const char *path,off_t length);int ftruncate(int fd,off_t length);返回值:成功返回0,失败返回-1作用:将一个名称为path或者被文件描述符fd引用的常规文件被截断成一个大小精为length字节的文件。如果先前的文件大于这个大小,额外的数据丢失。如果先前的文件小于当前定义的大小,那么,这个文件将会被扩展,扩展的部分将补以null,也就是‘\0’。
头文件:#include 
int rename(const char *oldname, const char *newname);返回值:成功返回0,失败返回-1作用:将指定目录/文件进行重命名,注意newname如果已存在,需要分情况处理:(1) 如果oldname为一个文件,那么为该文件更名。在这种情况下,如果newname作为一个目录已存在,则它不能重命名一个目录。如果newname已存在,而且不是一个目录,则先将其删除(rename会负责删除操作)然后将oldname更名为newname。对oldname所在目录以及newname所在的目录,调用进程必须具有写许可权,因为将更改这两个目录。(2) 如若oldname为一个目录,那么为该目录更名。如果newname已存在,则它必须是一个目录,而且该目录应当是空目录(空目录指的是该目录中只有. 和.. 项)。如果newname存在(而且是一个空目录),则先将其删除,然后将oldname更名为newname。另外,当为一个目录更名时,newname不能包含oldname作为其路径前缀。例如,不能将/usr更名为/usr/foo/testdir,因为老名字( /usr/foo)是新名字的路径前缀,因而不能将其删除。(3) 作为一个特例,如果oldname和newname引用同一文件,则函数不做任何更改而成功返回。
头文件:#include
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);作用:打开指定路径的文件操作流,fopen指定的绝对路径,freopen可以指定相对路径
int fclose(FILE *fp);作用:关闭指定的文件操作,此时缓冲区里面的数据会被刷新
void setbuf(FILE *stream, char *buf);int setvbuf(FILE *stream, char *buf, int mode, size_t size);作用:为指定的文件流指定缓冲区。其中mode可以取以下值:  _IOFBF(满缓冲):当缓冲区为空时,从流读入数据。或者当缓冲区满时,向流写入数 据。  _IOLBF(行缓冲):每次从流中读入一行数据或向流中写入一行数据。  _IONBF(无缓冲):直接从流中读入数据或直接向流中写入数据,而没有缓冲区。

 关于缓冲区相关知识,建议阅读:

int fflush(FILE *stream);作用:主动刷新文件流的缓冲区
int ferror(FILE *stream);作用:获取去文件流错误,文件流无错误时,返回一个零值,发生错误时返回一个非零值。int feof(FILE *stream); 作用:判断文件流是否到达文件尾void clearerr(FILE *stream);作用:清除文件流错误状态

 

获取文件指针:        int ftell(FILE *stream); //获取文件指针相对于开头的偏移    int fseek(FILE *stream, long offset, int whence);    void rewind(FILE *stream);//设置文件位置为给定流 stream 的文件的开头    int fgetpos(FILE *stream, fpos_t *pos);//获取流 stream 的当前文件位置,并写入到pos    int fsetpos(FILE *stream, fpos_t *pos);//设置文件位置为给定pos位置    off_t ftello(FILE *stream);//同ftell,只是参数类型不同    int fseeko(FILE *stream, off_t offset, int whence);//同fseek,只是参数类型不同   字符IO:    int getc(FILE *stream);    int fgetc(FILE *stream);    int getchar(void);    int ungetc(int c, FILE *stream);    int putc(int c, FILE *stream);    int fputc(int c, FILE *stream); int putchar(int c);行IO:    char* gets(char *s);    char* fgets(char *s, int size, FILE *stream);    int puts(const char *s);    int fputs(const char *s, FILE *stream);二进制IO:    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);
临时文件:    FILE *tmpfile(void);    //以二进制更新模式(wb+)在 /tmp 文件夹中创建一个临时文件。被创建的临时文件会在流关闭的时候或者在程序终止的时候自动删除    char *tmpnam(char *s);    //生成并返回一个有效的临时文件名,该文件名之前是不存在的。如果 str 为空,则只会返回临时文件名    char *tempnam(const char *dir, const char *pfx);    //按照指定的目录dir及前缀pfx生成一个临时文件,并将文件绝对路径名返回     char* mktemp(char *template);    //按照template传入的字符创建临时文件,注意template 必须以 XXXXXX 结尾,随后创建的临时文件名保证其前缀不变,用随机字符替换这6个X     int mkstemp(char *template);     //意义基本同mktemp,但是该函数不仅创建临时文件,还会以当前用户可读可写的方式打开文件,并返回其文件描述符

二、目录操作

(1)打开/关闭目录文件

#include <dirent.h>

DIR* opendir(const char* dirname);
int closedir(DIR* dirp);

opendir()函数用于打开一个目录文件,其中dirname为目录路径,执行成功,返回一个目录流指针,失败返回NULL

closedir()函数用于关闭指定的目录流,成功返回0,失败返回-1

(2)读取目录内容

#include <dirent.h>

struct dirent* readdir(DIR* dirp);
int readdir_r(DIR* dirp,struct dirent* entry,struct dirent ** result);

其中struct dirent定义如下:

// from dirent.h

struct dirent
{
    long ino;                    //目录中某文件的innode值
    _kerbel_off_t d_off;         // 从目录开始到当前目录条的距离
    unsigned short d_reclen;     // 目录中某文件名的长度
    char d_name[256];            //  目录中某文件名
}

readdir()函数执行成功则返回一个指向struct dirent的结构体,,如果到达目录结尾,或失败,则范湖NULL。

readdir_r()函数在多线程编程中相对安全,且此函数第一个参数为打开的目录指针,它将初始化第二个参数引用的struct dirent结构,以表示第一个参数所引用的目录流的当前位置,并将所在位置的信息存储在第三个参数中。函数执行成功,将返回目录流中的一个文件信息,到达目录尾在返回0,执行失败返回-1。

(3)定位目录位置

long int telldir(DIR* dirp);             //返回目录流的当前位置

void seekdir(DIR* dirp,long int loc);   // 设置下一个readdir()位置
void rewinddir(DIR* dirp);              //将目录流的位置重置到目录的开头

 

(4)当前工作路径操作

char* getcwd(char* buf,size_t size); //获取当前工作路径的绝对路径到buf中,并返回buf

int chdir(const char* path);//修改当前进程的环境变量的当前工作路径,成功返回0,失败返回-1
 

转载地址:http://hgsub.baihongyu.com/

你可能感兴趣的文章
用 Recursive Neural Networks 得到分析树
查看>>
RNN的高级应用
查看>>
TensorFlow-7-TensorBoard Embedding可视化
查看>>
轻松看懂机器学习十大常用算法
查看>>
一个框架解决几乎所有机器学习问题
查看>>
特征工程怎么做
查看>>
机器学习算法应用中常用技巧-1
查看>>
机器学习算法应用中常用技巧-2
查看>>
通过一个kaggle实例学习解决机器学习问题
查看>>
决策树的python实现
查看>>
Sklearn 快速入门
查看>>
了解 Sklearn 的数据集
查看>>
用ARIMA模型做需求预测
查看>>
推荐系统
查看>>
TensorFlow-11-策略网络
查看>>
浅谈 GBDT
查看>>
如何选择优化器 optimizer
查看>>
一文了解强化学习
查看>>
CART 分类与回归树
查看>>
seq2seq 的 keras 实现
查看>>