Linux下文件类型:
a.文本文件 b.二进制文件
目录文件:d dir
块设备文件:b block
字符设备文件:c char
管道文件:p piple
链接文件:l link
套接字文件:s socket
一、标准IO
特点:c库函数、带缓冲、通过流指针来操作(FILE *)、一般用于普通文件的操作
函数、API、接口都是一个说法
1.FILE指针和流
流:字节的进进出出
FILE指针:每个被使用的文件都在内存中开辟一片区域,用来保存文件的相关信息,这些信息保存在结构体类型变量中,该结构体类型是系统定义的,取名为FILE
在标准Io中所有的操作都是围绕流来进行的,在标准IO中用FILE* 来描述
2.相关操作
(1)打开文件
FILE *fp = NULL;
fp = fopen(argv[1],"w");
if(NULL == fp)
{
perror("open error");
return -1;
}
(2)关闭文件
fclose(fp);
返回值:成功返回0,失败返回EOF
注意:EOF只能判断是否到达文件的末尾
(3)操作文件
a.按字符读写
int fgetc(FILE *stream);//要操作的流
int fputc(int c,FILE *stream);//要输入的字符的ASCII码 要操作的流
//显示指定文件的内容
//打开文件
FILE *fr = fopen(argv[1],"r");
if(NULL == fr)
{
perror("open error");
return -1;
}
//操作文件
char ch;
whle(1)
{
ch = fgetc(fr);
if(EOF == ch)
{
break;
}
fputc(ch,stdout);
}
//关闭文件
fclose(fr);
案例:实现文件的拷贝(用两个文件就行)
//打开文件1
FILE *fr = fopen(argv[1],"r");
if(NULL == fr)
{
perror("open error");
return -1;
}
//打开文件2
FILE *fw = fopen(argv[2],"w");
if(NULL == fw)
{
perror("open error");
return -1;
}
char ch;
//操作文件
while(1)
{
ch = fgetc(fr);
if(EOF == ch) //if(feof(fr))
{
break;
}
fputc(ch,fw);
}
//关闭文件
fclose(fr);
fclose(fw);
int feof(FILE*stream);//测试是否到达文件末尾,非0表示到达文件末尾,为0表示没有到达未见末尾
//feof既能判断是否到达文本文件的末尾,也能判断是否到达二进制文件的末尾
b.按行读写
char *fgets(char *s,int size,FILE *stream);//从指定的流中读取一串字符
//1.读到的内容空间的首地址
//2.要读取的字节数
//3.要操作的流
char str[5] = {0};
fgets(str,sizeof(str),stdin);
puts(str);
注意:(1):fgets做多读取SIZE-1个字符(2)如果读取小于SIZE,会把换行也读进去
int fputs(const char *s,FILE *stream);
成功返回非负整数,失败返回-1
char str[5] = {0};
fgets(str,sizeof(str),stdin);
fputs(str,stdout);
案例:实现文件的拷贝cp
FILE *fr = fopen(argv[1],"r");
if(NULL == fr)
{
perror("open file1 error");
return -1;
}
FILE *fw = fopen(argv[2],"w");
if(NULL == fw)
{
perror("open file2 error");
return -1;
}
char buf[1024] = {0};
while(1)
{
memset(buf,0,sizeof(buf));
char *atr = fgets(buf,sizeof(buf),fr);
if(NULL == atr)
{
break;
}
fputs(buf,fw);
}
fclose(fr);
fclose(fw);
c.按块读写
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
//fread(buf,1,sizeof(buf),fr);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
要写的内容的首地址 块的大小 块的个数 要操作的流
//fwrite(&Stu,1,sizeof(Stu),fr);
long ftell(FILE *stream); //获取文件的位置
int fseek(FILE *stream,long offset,int whence); //获取文件流的位置
SEEK_CUR:当前位置
SEEK_END:文件末尾
SEEK_ SET:文件开头
文件IO
特点:系统调用、无缓冲机制、文件描述符、一般用于设备文件的操作
一.相关函数
1.打开文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
O_RDONLY: 只读; O_WRONLY:只写 O_RDWR:可读可写
其余的和上面进行或运算
O_CREAT:如果文件不存在,则新建(必须使用第三个参数)
O_EXCL:如果使用O_CREAT时文件存在,则可返回错误消息。这一参数可测试文件是否存在。
int fd = open(argv[1],O_RDONLY | O_CREAT | O_EXCL,0664);
2.关闭文件
#include <unistd.h>
int close(int fd);
close(fd);
3.文件掩码
测试OS最多能同时打开多少个文件
int sprintf(char *str, const char *format, ...);
注意:程序运行起来之后有3个文件已经默认打开,标准输入、标准输出、标准出错
stdin stdout stderr
4.操作文件
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
//read(fr,&stu,sizeof(Stu));
ssize_t write(int fd, const void *buf, size_t count);
//write(fw,&stu,sizeof(Stu));
off_t lseek(int fd, off_t offset, int whence);//获取文件流的位置
//fseek(fp,10,SEEK_CUR);//从当前位置向后偏移10个字节
二、目录
1.打开目录
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name);
2.操作目录
#include <sys/types.h>
struct dirent *readdir(DIR *dirp)
3.关闭目录
#include <sys/types.h>
#unclude <dirent.h>
int closedir(DIR *dirp)
DIR *p = opendir(argv[1]);
{
if(NULL == p)
{
perror("open error");
return -1;
}
struct dirent *pp = NULL;
while(1)
{
pp = readdir(pDir)
if(NULL == pp)
{
break;
}
if(pp->d_name[0] != '.')
{
printf("%s "pt->d_name);
}
}
closedir(pDir);
}