文件IO

C代码

fopen

/* fopen需要的头文件 */
#include <stdio.h>
FILE *fp = fopen("./test.txt", "r");  /* 如果没有打开文件则返回NULL */
/*
	./test.txt为文件路径,./表示当前目录下的text.txt文件,可以使绝对路径如: 
				C:/Users/17727/Desktop/test.txt
	"r" = "rt"
	打开一个文本文件,文件必须存在,只读
	"r+" = "rt+"
	打开一个文本文件,文件必须存在,读写
	"rb"
	打开一个二进制文件,文件必须存在,只读
	“rb+”
	打开一个二进制文件,文件必须存在,允许读写
	"w" = “wt”
	新建一个文本文件,已存在的文件将被删除,只写
	"w+" = "wt+"
	新建一个文本文件,已存在的文件将被删除,允许读写
	“wb”
	新建一个二进制文件,已存在的文件将被删除,只写
	“wb+”
	新建一个二进制文件,已存在的文件将被删除,允许读写

	"a" = "at"
	打开或新建一个文本文件,只允许在文件末尾追写
	"a+" = "at+"
	打开或新建一个文本文件,可以读,但只允许在文件末尾追写
	“ab”
	打开或新建一个二进制文件,只允许在文件末尾追写
	“ab+”
	打开或新建一个二进制文件,可以读,但只允许在文件末尾追写
*/
size_t fread(void *buf, size_t size, size_t count, FILE *fp);
size_t fwrite(const void * buf, size_t size, size_t count, FILE *fp);
/* 
	buf是缓存buffer,size是单个元素的大小,如char则写1或者sizeof(char),
	count是buf大小(最好减一,防止溢出), fopen返回的指针
*/
/* 如何判断文件已经读到末尾 */
/* stdio这个头文件已经提供了方法,使用feof()函数即可 */
while(!feof(fp))
{
	fread(buf, 1, 128, fp);
	printf("%s\n", buf);
}
int fseek(FILE *stream, long offset, int fromwhere);
/*  
	fseek()函数是把文件指针放到指定位置 
	fromwhere可以使以下几种,此时offset要写成0
	SEEK_SET: 文件开头
	SEEK_CUR: 当前位置
	SEEK_END: 文件结尾
*/
fseek(fp, 0, SEEK_SET);
int fclose(FILE *stream)
/* 关闭文件指针,如果流成功关闭,则该方法返回零。如果失败,则返回 EOF */

open

/* open需要的函数 */ 
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(const char *pathname, int flags);
int fd = open(const char *pathname, int flags, mode_t mode);
/*	
	返回值:成功:返回文件描述符;失败:返回-1
	pathname为文件的路径,可以为相对路径也可以是绝对路径;
	flags为标志分为两类:主类和副类
	主类:
	O_RDONLY 以只读方式打开   /   O_WRONLY 以只写方式打开   /O_RDWR 以可读可写方式打开
	这三类是互斥的
	副类:
	O_CREAT 如果文件不存在则创建该文件
	
	O_EXCL 如果使用O_CREAT选项且文件存在,则返回错误消息
	
	O_NOCTTY 如果文件为终端,那么终端不可以调用open系统调用的那个进程的控制终端	
	
	O_TRUNC 如果文件已经存在则删除文件中原有数据
	
	O_APPEND 以追加的方式打开主副可以配合使用
	mode:如果文件被新建,指定其权限为mode,是八进制代码
	S_IRWXO 00007权限,代表其他用户具有可读、可写及可执行的权限。
	S_IROTH 00004权限,代表其他用户具有可读的权限
	S_IWOTH 00002权限,代表其他用户具有可写入的权限。	
	S_IXOTH 00001权限,代表其他用户具有可执行的权限
	八进制:0664 == 0 00002+00004 00002+00004 00004	-rw-rw–r–
 */
int fd = open("./test.txt", O_RDWR|O_CREAT, 0664);
ssize_t read(int fd,void *buf,size_t nbytes);
ssize_t write(int fd,void *buf,size_t nbytes);
/* 
	若成功返回读到的字节数,若读到文件末尾返回0,若失败返回-1
	read:nbytes为读到buf的大小,nbytes最大为sizeof(buf)-1,减一是在最后放'\0'
	write则不用考虑减一
*/
/* 判断文件结束方法 */
	while(1){
		bzero(buf, sizeof(buf));
		ret = read(fd, buf, sizeof(buf));
		if( ret <= 0 )
			break;
	}
/*	
	说明:最后一次读到文件末尾,判断ret不为0,进入循环,此时已为末尾,
	读不到东西,ret = -1,break
*/
off_t lseek(int fileds,off_t offset,int whence);
/*	
	文件开始           当前位置           文件末尾
    SEEK_SET          SEEK_CUR          SEEK_END
*/
lseek(fd, 0, SEEK_SET);
int close(int fd);
/* 返回值:若文件顺利关闭则返回0, 发生错误时返回-1. */
close(fd);

C++

#include <fstream>
/*
 * ofstream: 写操作
 * ifstream: 读操作
 *  fstream: 读写操作
 */
// 写文件
ofstream ofs;					// 创建流对象
// ofstream ofs("file path", method);
ofs.open("file path", method);	// 打开文件
ofs << "写入的数据";				// 写数据
ofs.close() 					// 关闭文件
method解释
ios::in只读
ios::out只写
ios::ate初始位置:文件尾
ios::app追加方式写文件
ios::trunc如果文件存在,先删除,在创建
ios::binary二进制方式打开文件

注意:文件打开方式可以配合使用,利用 ‘|’ 操作符

#include <fstream>
// 读文件
ifstream ifs;
ifs.open("file path", method);
// 1
char buf[256] = {0};
while (ifs >> buf) {	// 每次读一行,读到结尾返回EOF
	std::cout << buf << "\n";
}

// 2
char buf[256] = {0};
while (ifs.getline(buf, sizeof(buf)) {
	std::cout << buf << "\n";
}

// 3
string str;
while (std::getline(ifs, str)) {
    cout << str << endl;
}

二进制处理文件使用 ofsteam.write; ifstream.read

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值