标C与Uinx C下文件操作的对比

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值