C文件操作
相关函数:
FILE * fopen(const char * path,const char * mode);
r 打开只读文件,r+打开可读写文件(可覆盖),该文件必须存在
w 打开只写文件,w+打开可读写文件(绝对覆盖清空,相当于新文件),若文件不存在则建立该文件
a 打开只写文件,末尾追加,若文件不存在则建立该文件,a+ 打开可读写文件,末尾追加,若文件不存在则建立该文件,文件流位置在头(不可回退)
int fscanf(FILE *stream, char *format[,argument...]);//从流中输入
int fprintf(FILE *stream, char *format[, argument,...]);//从流中输出
FILE * fdopen(int fd,const char * mode);//文件描述词,用过socket,看见fd就不陌生,相当于windows中资源ID,linux的一切都是文件的概念,不做介绍,范围太大,不常用的感觉
int fileno(FILE * stream);//获取文件描述词(fd)
int feof(FILE * stream);//如到末尾返回非0
int fflush(FILE* stream);//刷新缓冲区
size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
int fgetc(FILE * stream);//读取一个字符,末尾EOF
int getc(FILE * stream);//宏定义,非真正调用
int getchar(void);//实质getc(stdin)
char * fgets(char * s,int size,FILE * stream);//从流中读取size-1个字符或EOF,最后加上NULL,成功返回s,否则NULL
int ungetc(int c,FILE * stream);//将指定字符写回文件流中,没卵用
int fputc(int c,FILE * stream);//顾名思义
int putc(int c,FILE * stream);//与上意义相同,不做解释
int putchar (int c);//putc(c,stdout)
int fputs(const char * s,FILE * stream);//顾名思义
size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream);//存储复杂类型
FILE * freopen(const char * path,const char * mode,FILE * stream);//重定向流,扯淡的玩意
void rewind(FILE * stream);//重设文件流的读写位置为文件开头
int fseek(FILE * stream,long offset,int whence);//移动文件流位置
SEEK_SET 从距文件开头offset位移量为新的读写位置
SEEK_CUR 以目前的读写位置往后增加offset个位移量
SEEK_END 将读写位置指向文件尾后再增加offset个位移量。
当whence值为SEEK_CUR 或SEEK_END时,参数offset允许负值的出现。
long ftell(FILE * stream);//取得文件流的读取位置
char * mktemp(char * template);//产生唯一的临时文件名
int mkstemp(char * template);//建立唯一的临时文件,返回FD
void setbuf(FILE * stream,char * buf);//设置文件流的缓冲区
void setbuffer(FILE * stream,char * buf,size_t size);//设置文件流的缓冲区
void setlinebuf(FILE * stream);//设置文件流为线性缓冲区
int unlink(const char * pathname);//删除参数pathname 指定的文件. 如果该文件名为最后连接点, 但有其他进程打开了此文件, 则在所有关于此文件的文件描述词皆关闭后才会删除. 如果参数pathname 为一符号连接, 则此连接会被删除
int close(int fd);
int fclose(FILE * stream);
C++文件操作
类:
ofstream: 写操作
ifstream: 读操作
fstream: 可同时读写操作
默认:
ofstream ios::out | ios::trunc
ifstream ios::in
fstream ios::in | ios::out
相关函数:
void open (const char * filename, openmode mode,int access);
ios::in
ios::out
ios::ate 只能读文件(|ios::out=r、|ios::in=r+并将文件移至末尾)
ios::app 所有输出附加在文件末尾 (a、a+)
ios::trunc 如果文件已存在则先删除该文件(w、w+)
ios::binary 二进制方式(b)
打开文件的属性取值是:
0:普通文件,打开访问
1:只读文件
2:隐含文件
4:系统文件
pos_type tellg() 和 pos_type tellp()
这两个成员函数不用传入参数,返回pos_type 类型的值(根据ANSI-C++ 标准) ,就是一个整数,代表当前get 流指针的位置 (用tellg) 或 put 流指针的位置(用tellp).
seekg ( off_type offset, seekdir direction );
seekp ( off_type offset, seekdir direction );
ios::beg 从流开始位置计算的位移
ios::cur 从流指针当前位置开始计算的位移
ios::end 从流末尾处开始计算的位移
write ( char * buffer, streamsize size );
read ( char * buffer, streamsize size );
操纵符 功能 输入/输出
dec 格式化为十进制数值数据 输入和输出
endl 输出一个换行符并刷新此流 输出
ends 输出一个空字符 输出
hex 格式化为十六进制数值数据 输入和输出
oct 格式化为八进制数值数据 输入和输出
setpxecision(int p) 设置浮点数的精度位数 输出
读取整个文件内容到string
std::ifstream in("content.txt");
std::string str((std::istreambuf_iterator<char>(in)),
std::istreambuf_iterator<char>());
读取整个文件内容到stringstream
std::ifstream in("content.txt");
std::stringstream buffer;
buffer << in.rdbuf();
读取目录文件列表
#include<iostream>
#include<dirent.h>//win linux 可跨平台获取目录下文件名称
#include<sys/stat.h>//linux获取文件类型、权限等
using namespace std;
/*
struct stat {
dev_t st_dev; //文件的设备编号
ino_t st_ino; //节点
mode_t st_mode; //文件的类型和存取的权限
nlink_t st_nlink; //连到该文件的硬连接数目,刚建立的文件值为1
uid_t st_uid; //用户ID
gid_t st_gid; //组ID
dev_t st_rdev; //(设备类型)若此文件为设备文件,则为其设备编号
off_t st_size; //文件字节数(文件大小)
unsigned long st_blksize; //块大小(文件系统的I/O 缓冲区大小)
unsigned long st_blocks; //块数
time_t st_atime; //最后一次访问时间
time_t st_mtime; //最后一次修改时间
time_t st_ctime; //最后一次改变时间(指属性)
};
mode_t:
S_IFMT 0170000 文件类型的位遮罩
S_IFSOCK 0140000 scoket
S_IFLNK 0120000 符号连接
S_IFREG 0100000 一般文件
S_IFBLK 0060000 区块装置
S_IFDIR 0040000 目录
S_IFCHR 0020000 字符装置
S_IFIFO 0010000 先进先出
S_ISUID 04000 文件的(set user-id on execution)位
S_ISGID 02000 文件的(set group-id on execution)位
S_ISVTX 01000 文件的sticky位
S_IRUSR(S_IREAD) 00400 文件所有者具可读取权限
S_IWUSR(S_IWRITE)00200 文件所有者具可写入权限
S_IXUSR(S_IEXEC) 00100 文件所有者具可执行权限
S_IRGRP 00040 用户组具可读取权限
S_IWGRP 00020 用户组具可写入权限
S_IXGRP 00010 用户组具可执行权限
S_IROTH 00004 其他用户具可读取权限
S_IWOTH 00002 其他用户具可写入权限
S_IXOTH 00001 其他用户具可执行权限
上述的文件类型在POSIX中定义了检查这些类型的宏定义:
S_ISLNK (st_mode) 判断是否为符号连接
S_ISREG (st_mode) 是否为一般文件
S_ISDIR (st_mode) 是否为目录
S_ISCHR (st_mode) 是否为字符装置文件
S_ISBLK (s3e) 是否为先进先出
S_ISSOCK (st_mode) 是否为socket
struct dirent
{
long d_ino; //inode number 索引节点号
off_t d_off; //offset to this dirent 在目录文件中的偏移
unsigned short d_reclen; //length of this d_name 文件名长
unsigned char d_type; //the type of d_name 文件类型 不是所有系统支持
char d_name [NAME_MAX+1]; //file name (null-terminated) 文件名,最长256字符
};
*/
int main(){
DIR* dir;
dir=opendir(".");
dirent* p;
while(p=readdir(dir)){
struct stat buf;
stat(p->d_name,&buf);
cout<<(040000&buf.st_mode)<<':'<<p->d_name<<endl;
}
closedir(dir);
return 0;
}