C/C++ 文件操作总结

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;
}

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值