流IO和文件IO的简单使用
流文件IO(fopen....)是标准IO,包含在stdio.h中,可移植性强,使用的是文件指针
而文件IO(open...)可移植性低,包含在fcntl.h中,使用的是一个整形的文件描述符
标准IO/流IO
下面这个程序是用流来读写文件的,从终端输入,重复100遍的输入文件中,再读出来打印至屏幕上
#include<stdio.h>
int main()
{
FILE *fp;
char a[100];
char b[100];
int c=100;
fp=fopen("ckx","w+");
fgets(a,sizeof(a)-1,stdin);
while(c-->0)
{
fwrite(a,1,strlen(a),fp);//或者fputs(a,fp);
}
fseek(fp,0,SEEK_SET);
while(fread(b,1,sizeof(b),fp)>0)
{
fputs(b,stdout);
}
fclose(fp);
return 0;
}
FILE *fp为打开流返回的文件指针
FILE * fopen(const char * path, const char * mode);//打开流
mode字符串看下表,常用追加a+,清空并读写w+
char *fgets(char *buf, int bufsize, FILE *stream);//行输入函数
buf为字符串,bufsize为读取数据的大小,stream为文件流,如果从终端输入则为stdin
fgets函数最后一位必须为’\0’
int fputs(const char *str, FILE *stream);//行输出函数
如果输出到终端,则为stdout
size_t fread(void *restrict ptr,size_t size,size_t nobj,FILE * restrict fp);//二进制读
ptr为数组,size为读的单位大小(如果为char,设为1),nobj为读多少个单位
size_t fwrite(const void *restrict ptr,size_t size,size_t nobj,FILE * restrict fp);//二进制写
同fread
int fseek(FILE *fp,long offset,int whence);//定位流
whence参数
SEEK_SET代表从文件的起始位置开始,offset>=0
SEEK_CUR表示从当前位置开始,offset可正可负
SEEK_END表示从文件末尾开始,offset可正可负
文件IO
#include<stdio.h>
#include<fcntl.h>
int main()
{
int fd,c=100;
char a[100],b[100];
fd=open("ckx",O_CREAT|O_APPEND|O_RDWR,0666);
scanf("%s",a);
while(c-->0)
{
write(fd,a,strlen(a));
}
lseek(fd,0,SEEK_SET);
while(read(fd,b,sizeof(b))>0)
{
// fputs(b,stdout);
printf("%s",b);
}
close(fd);
return 0;
}
int open(constchar*pathname,intflags,mode_tmode);
O_RDONLY只读模式
O_WRONLY只写模式
O_RDWR读写模式
打开/创建文件时,至少得使用上述三个常量中的一个。以下常量是选用的:
O_APPEND每次写操作都写入文件的末尾
O_CREAT如果指定文件不存在,则创建这个文件
O_EXCL如果要创建的文件已存在,则返回-1,并且修改errno的值
O_TRUNC如果文件存在,并且以只写/读写方式打开,则清空文件全部内容(即将其长度截短为0)
O_NOCTTY如果路径名指向终端设备,不要把这个设备用作控制终端。
O_NONBLOCK如果路径名指向FIFO/块文件/字符文件,则把文件的打开和后继I/