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