Operation | Standard C | UC |
Create/ open | 1. 打开/创建新文件 FILE*fopen(const char *filename,const char *type); 2. 重新打开文件:先关闭原文件流并重新以fopen()方式打开文件 FILE *freopen(const char *filename, const char *type,FILE *sream); 3.Rename更改文件名int rename(const char *oldname, const char *newname); | 1. 创建: #include <fcntl.h> int creat(const char *filename, mode_t mode); 2.打开:#include <fcntl.h> int open (const char *pathname, int flags); int open (const char *pathname, int flags, mode_t mode); flags值: O_RDONLY只读 O_WRONLY 只写O_RDWR读写 O_APPEND 追加 O_CREAT创建 + O_EXEC且文件存在,返错 O_NOBLOCK非阻塞 O_TRUNC文件存在,删除内容 |
close | Int fclose(FILE *stream); | #incliude <unistd.h> int close(int fd); |
remove | int remove(const char * filename); | #incliude <unistd.h> int unlink (char * path); |
Write | 1).字符输出#include<stdio.h>//成功返回写入值,否则返回EOF int putc(int c,FILE *stream);//将C转换为unsigned char 类型后写入stream流中,并移动一位指针 int putchar(int c); int fputc(int c,FILE *stream); 2).行输出 //参数s指向一串以'\0'结尾的字符 int puts(cosnt char *s); //写入stdout自动输出\n int fputs(const char *s,FILE *stream); //写入stream中,不输出\n
#include<string.h> char *strstr(char *s1,char *s2)返回s2第一次在s1中出现的位置的首地址 3).块(block)写(二进制方式写入/读取) 成功返回n_items,否则返回值<n_items,将ptr写入stream,可写size*n_items字符: size_t fwrite(const void * ptr, size_t size, size_t n_items, FILE *stream); 4).格式化写: //等同printf()中内容输出到文件流/字符串中 int fprintf(FILE *stream,const char *format,...); int sprintf(char *s,const char format,...); | #incliude <unistd.h> int write(int fd, const void *buf, size_t length); 把length个字节从buf写到fd所指向的文件中,返回值为实际写入的字节数。 |
Read | 1).字符输入#include <stdio.h> 结束/误时返回EOF(常数,一般为-1) int getc(FILE *stream); //以unsigned char t读取文件内一个字符,化为整数返回 int getchar(void); int fgetc(FILE *stream); 2).行输入#include<stdio.h> a.错误/结束返回NULL,成功返回s指向的地址从stdin中读取字符串至S, char *gets(char *s) b.从标准输入流中读取字符串至指定大小的S中,错误/结束返回NULL char *fgets(char *s,int n,FILE *stream) 3).块(block)读(二进制方式写入/读取) //成功返回n_items,否则返回值小于n_items,从stream中读入n_items个数据项到ptr所指内存中,大小为size/数据项 size_t fread(void *ptr,size_t size,size_t n_items, FILE *stream); | #incliude <unistd.h> int read (int fd, const void *buf, size_t length); //从fd所指定的文件中读取length个字节到buf,返回值为实际读取的字节数 |
Buffer | #include<stdio.h> //引出setbuf()、setvbuf()有效调用时期:stream尚 未打开或未执行读写操作前 //设置文件流缓冲区,大小为buf,若buf=NULL,则完全关闭缓冲区 void setbuf(FILE * stream,char *buf); //设置stream的缓冲区和缓冲模式(由type决定: _IOFBF全缓冲,_IOLBF行缓冲,_IONBF无缓冲) int setvbuf(FILE *stream, char *buf,int type, size_t size ) int fflush(FILE *stream); //刷新缓冲区 | #incliude <unistd.h> //将所有写入文件fildes中数据真正写入磁盘中,类似于fflush(),成0败-1 int fsync(int fildes) |
Seek | 1)改变文件的访问位置,whence表明定位方式( SEEK—SET 0当前位置 SEEK—CUR 1和文件末尾 SEEK—END 2),offset为偏移量 int fseek(FILE *stream,long int offset,int whence) 2)重置流stream,将文件流定位于开始处 void rewind(FILE *stream); 3)获取当前访问位置,成功返回位置,否则-1: long int ftell(FILE * stream); | #incliude <unistd.h> //将读写指针相对whence移动offset个字节。成功返回文件指针相对于文件头的位置。 int lseek(int fd, offset_t offset, int whence); whence 可用值: SEEK_SET文件开头 SEEK_CUR当前位置 SEEK_END文件末尾 |
File DESC | 1).文件的错误与结束状态 int ferror(FILE *stream); //IO错误时 !0,否则0 int feof(FILE *stream); //文件结束时,返回 !0 void clearerr(FILE *stream); //清除stream错误和EOF标志 2).文件的错误信息 extern int errno; //表示错误代码 #include <string.h> Char *strsrror(int errnum); //获取错误的详细信息 | 1. 复制文件描述符 #incliude <unistd.h> int dup(int fildes); int dup2(int fildes,int fildes2); dup和dup2用于复制文件描述符, dup2可以指定新的文件描述符的数值,如果新的文件描述符的值已经被使用,dup2会关闭掉后进行复制。dup和dup2不复制文件表,只复制文件描述符 |
File Control(只有UC具备) | Fcntl()对文件描述符执行各种命令,cmd决定具体命令和有无第三参数 #include <unistd.h> #include <fcntl.h> /*cmd:① F_DUPFD 复制文件描述符,和dup2不同的是不会强行关闭已经使用的文件描述符②F_GETFD/F_SETFD 获取/设置文件描述符标志③F_GETFL/F_SETFL 获取/设置文件状态标志* / int fcntl(int fd, int cmd); int fcntl(int fd, int cmd,int arg); int fcntl(int fd, int cmd,struct flock *arg); //F_SETLK /F_GETLK/F_SETLKW获取/设置文件锁,cmd值:F_SETLK - 加锁(锁的类型是F_UNLCK时解锁) F_SETLKW - 加锁 经验: 1)设置状态时用位或| , 判断存在用位与& 2)读锁是共享锁,允许其他进程读,但不允许写,写锁是独占锁,不允许其他进程读写 3)用fcntl()加锁,cmd使用F_SETLK/F_SETLKW加锁。C用结构体flock代表文件锁: struct flock{ short l_type; // 锁的类型有三种:F_RDLCK/F_WRLCK/F_UNLCK(释放锁) short l_whence;// 锁的起始位置的参照点 int l_start;// 锁的起始位置 int l_len;// 锁定的长度,0表示锁至文末 pid_t l_pid;// 加锁的进程id(只有GETLK有效) l_pid 一般给 -1 即可。 }; 区别: ① F_SETLK加锁时,非阻塞,如果锁加不上,直接返回-1; ② F_SETLKW加锁时阻塞,如果锁加不上,等待. ③ F_GETLK - 测试锁能不能加上(不是取锁) 文件锁只是在进程中做了锁定的标识,并没有真正锁定文件,因此文件锁无法限定对文件读写。 文件锁的用法:凡是调用read之前上读锁,调用write之前上写锁才能有效果。(fcntl(F_SETLK)不会锁定任何东西,但可以与另一个fcntl(F_SETLK) 呼应) F_GETLK - 测试一个锁能不能加上(不是取锁),如果能加,不真正加锁,把锁的类型改为F_UNLCK返回,如果不能加锁,返回当前正在使用的锁(原因),并改变pid的值为正在使用的锁的PID。 判断锁能否加上的条件是pid是否= -1 |
标C与Uinx C下文件操作的对比
最新推荐文章于 2023-01-02 20:41:44 发布