I/O文件库

有几个因素灰度文件的访问权限产生影响:
1 只有在创建文件是才会指定访问权限。
2 用户眼马(umask)会影响到被创建的文件的访问权限。open调用中的标志是设置文件访问权限的请求,所请求的权限是否会被设置取决于当时的umask值

1 umask:当文件创建时,为文件的访问权限设定一个掩码

1   所有者
2   所在组
3   其他用户

0   允许所有权限
4   禁止读
2   禁止写
1   禁止执行

2 close系统调用:终止一个文件描述符fildes与其对应文件之间的关联,fildes被释放并可以重新使用
#include<unistd.h>
int close(int fildes)
0 : 成功
-1:失败

3 ioctl调用 :提供一个用于控制设备机器描述符行为和配置底层服务的接口。
POSIX为流(stream)定义了ioctl调用

一个关于拷贝文件的程序(将file.in中的内容复制到file.out)
in=open("file.in",O_RDONLY);                           //打开已经存在的file.in,设置为readonly
out=open("file.out",O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR); //创建一个可写的file.out
while(read(in,&c,1)==1)                                //从file.in中读出1个字节放入c中
write(out,&c,1);                                       //将c中的1个字节内容放入file.out中

执行: TIMEFORMAT="" time ./copy_system     //使用time对这个程序运行的时间进行测算
0.00user 0.00system 0:00.00elapsed 50%CPU

3.4.5 其他与文件管理有关的系统调用
1 lseek系统调用 :对文件描述符的读写指针进行设置,可以用它来设置文件的下一个读写位置。读写指针可以设置为文件中的某个绝对位置,也可以设置为相对于当前位置或尾部的相对位置

#include<unistd.h>
#include<sys/types.h>
off_t lseek(int fildes,off_t offset,int whence);
offset  :用于指定位置
whence :定义偏移值的用法
返回值为从文件头到文件指针被设置处的字节偏移量
-1:返回失败

SEEK_SET :offset为绝对值
SEEK_CUR :current
SEEK_END :end

3.5 标准I/O库
标准I/O库及其头文件stdio.h为底层I/O系统调用提供了一个通用的接口。在I/O库中,与底层文件描述符对应的对等物叫流,被实现为FILE指针
在程序启动时,三个文件流是自动打开的,stdin,stdout,stderr.分别与底层文件描述符0,1,2想对应

3.5.1 fopen函数
#include <stdio.h>
FILE *fopen(const char *filename,const char *mode);
fopen打开由filename参数指定的文件,并把他和一个文件流关联起来。mode指定文件的打开方式
打开成功返回指向这个文件流的文件指针,否则返回null.
r  :readonly
w  :write,把文件长度揭短为0
a  :write,新内容追加在文件尾
r+ :以修改方式打开(读写),打开可读写文件,该文件必须存在
w+ :打开可读写文件,若文件存在则删除文件内容,若不存在则建立该文件
a+ :以附加的方式打开可读写文件,若文件存在则在尾部追加,若不存在则建立该文件。
上述的类型字符串都可以添加b,如rb,rb+,r+b等,加入b告诉函数库打开的文件是二进制文件,而非纯文本文件。
简单例子
#include<stdio.h>
main()
{
FILE *fp;
fp=fopen("hi.txt","a+");
if(fp==NULL)
printf("cannot open file!/n");
printf("open file!/n");
fclose(fp);
}

3.5.2 fread函数
size_t fread(void *ptr,size_t size,size_t nitems,FILE *stream);  <-------------------------
从一个文件流中读取数据。数据从stream读到ptr指定的数据缓冲区中。size指定每一个数据记录的长度,计数器nitems给出要传输的记录个数。
成功时,返回值为读入到数据缓冲区中的记录个数。到达文件尾时,返回值小于nitems

3.5.3 fwrite函数
size_t fwrite(const void *ptr,size_t size,size_t nitems,FILE *strream) ------------------------->
3.5.4 fclose函数
int fclose(FILE *stream) :关闭指定的文件流stream,使所有尚未写出的数据都写出。可用文件流的数目最大为8
int fflush(FILE *stream) :把文件流中的所有未写出数据立刻写出。不要在fclose()前使用
int fseek(FILE *stream,long int offset,int whence) :在文件流里为下一个读写操作指定位置
offset  :用于指定位置
whence :定义偏移值的用法
0:成功  -1:失败
int fgetc(FILE *stream)

FILE *stream;                             //文件指针
long offset;                              //偏移量
fpos_t pos;                              
stream=fopen("/etc/passwd","r");          //以只读的方式打开/etc/passwd
fseek(stream,5 ,SEEK_SET);                //翕动文件流的读写位置,从文件开头的5个位置开始
printf("offset=%d/n",ftell(stream));      //ftell(FILE *stream)取得文件流当前的读写位置
rewind(stream);                           //rewind(FILE *stream)重设文件流的读写位置为文件开头
fgetpos(stream,&pos);                     //fgetpos(FILE *stream,fpos_t *pos)读取stream的读取位置,pos返回读取位置
printf("offset=%d/n",pos);                //pos返回fgetpos的读写位置
pos.__pos=10;                             //用于设置偏移量,如同fseek中的offset和SEEK_SET
fsetpos(stream,&pos);                     //fsetpos(FILE *stream,fpos_t *pos)pos为翕动到的读写位置,stream为文件流
printf("offset=%d/n",ftell(stream));     
fclose(stream);

fgetc(FILE *stream):从stream所指的文件中读取一个字符。到文件尾返回EOF ,返回读取到的字符  while((c=fgetc(fp))!= EOF )
 getc(FILE *stream):作用于fgetc相同,但是getc()是宏定义,不是真正的函数调用。
getchar()         :从键盘中读取一个字符,然后将该字符从unsigned char转换为int后返回  int c=getchar();

fputc(int c,FILE *stream):将c转换为unsigned char后写入stream指定的文件中,返回写入成功的字符。 fputc(a[i],fp);
 putc(int c,FILE *stream):作用于fputc()相同,但是putc()是宏定义,不是真正的函数调用。
putchar(int c)           :将C显示在屏幕上

char *fgets(char *s,int size,FILE *stream): 从stream所指的文件内读入字符并存到s所指的内存空间,知道出现换行符,文件尾部,或者size-1个字节为止,最后加上NULL作为字符串结束。 成功返回s,失败返回NULL.   <--------------------------
int fputs(char *s,FILE *stream) :将s所指的字符串写入到stream所指的文件中   ---------------------------->
char *gets(char *s):从键盘读入字符并存到s所指的内存空间,直到出现换行符或文件尾,成功返回s,失败返回null
int puts(const char *s):将s写道屏幕 ,成功返回写出的字符个数,EOF为失败。

3.6 格式化输入和输出
int printf(const char *format,..)
format字符串包含一下三种字符类型:
1 一般文字,伴随直接输出。
2 ASCII控制字符,/t,/n等
3 格式转义字符 :%格式字符 %[flags][width][.prec]type
type的几种形式
1 整数
%d :有符号十进制
%u :无符号十进制
%o :无符号八进制
%x :无符号16进制,以abcdef表示
%X :无符号16进制,以ABCEDF表示
2 浮点数
%f :double类型的十进制,取得小数点6位
%e :以科学计数法输出一个双精度浮点数 
0.001234589 : 1.234589e-03
985345.14502 :9.853451e+05
%g :以一般格式输出一个双精度浮点数
3 字符及字符串
%c :unsigned char
%s :指向字符串的参数会逐字输出,知道出现NULL
prec的几种情况
1 正整数的最小位数
2 在浮点数中表示小数位数
3 在%s格式表示字符串的最大长度
5 若为*则表示下个参数值为最大长度
width为输出的最小长度,如果这个输出参数并非数值,而是*,则表示下一个参数当作输出长度
成功返回实际输出的字符数,失败返回-1。

%10s   "Hello"     |     Hello|
%-10s  "Hello"     |Hello     |
%10d   1234        |      1234|
%-10d  1234        |1234      |
%010d  1234        |

int i=150;
double k=3.14156;

printf("%10.4f/n",k);
printf("%4d/n",i);
printf("%-4d/n",i);
printf("%010d/n",i);
printf("%10.4f/n",k);
printf("%*s/n",10,"Hello"); //加上字符串右移10位

    3.1416
 150
150
0000000150
    3.1416
   Hello

正数右对齐
负数左对齐
以0开头的表示数据前面要用数字0填充
而对于
printf("%3s","ABCDEFG"); //ABCDEFG

int fprintf(FILE *stream,const char *format...) :以format格式的结果输出到stream指定的文件中,知道出现'/0'为止。
int i=150;
int j=-100;
double k=3.14159;
FILE *fp;
fp=fopen("file.in","a+");
fprintf(fp,"%d %g %x/n",j,k,i);

int sprintf(char *str,const char *format ...) :根据format格式化数据,将结果复制到参数str所指的字符串数组,知道出现('/0')

char *a="this is string a!";
char buf[80];
sprintf(buf,">>> %s <<</n",a);
printf("%10s",buf);                  //>>> this is string a! <<<

3.6.2 scanf,fscanf,sscanf
int scanf(const char *format...):将输入的数据根据format格式化数据
%[*][size][l][h]type
*      :对参数数据忽略不保存
size :允许参数输入的数据长度
l    :输入的数据数值以long int ,double存储
h    :输入的数据以short int 存储
type
包含printf中的参数
[] 读取数据但只允许括号内的字符。如[a-z]
[^]读取数据不允许括号内的字符。如[^a-z]
%% 读取一个%

就是这么一个简单的数据输入
char s[256];
int n;
float f;
char c;
scanf("Hello ,%d,%g,%c,%[^/n]",&n,&f,&c,s);
printf("Hello ,%d,%g,%c,%s",n,f,c,s);

方案一:
输入:1234,5.678,x,string to the end

输出:Hello ,3,-9.59892e+32,�,�

方案二:
输入:Hello,1234,5.678,x,string to the end
输出:Hello ,1234,5.678,x,string to the endyaozhangjun@yaozhangjun-desktop:~/progm$

方案三:将scanf改为scanf("Hello ,%d,%g,%c,%[^/n]/n",&n,&f,&c,s);
输入:Hello,1234,5.678,x string to the end
输出:Hello ,1234,5.678,x,�j۷yaozhangjun@yaozhangjun-desktop:~/progm$

死罪
而且如果对于要输入string,必须写作 % [^/n],否则会连累他前面的数据

scanf("%5[a-z]",s); 
输入 abcdefg            输出 abcde
输入 ab$%^makdi         输出 ab

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值