文件类型分为两种:
- 文本文件:文件以文本的ASCII码形式存储在计算机中
- 二进制文件:文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们
系统API(linux)
和文件读写相关的函数:open、close、write、read、lseek
open
**函数功能:**打开或者创建一个文件
概要:
#include <fcntl.h> //头文件
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode); //mode就是权限
参数说明:
-
pathname:文件路径,可以是相对的(以当前程序运行路径为基准),也可以是绝对路径
-
flags:必须从下面的模式种选择一种,然后可以使用
|
拼接其他模式O_RDONLY 只读模式 O_WRONLY 只写模式 O_RDWR 读写模式
常量 | 含义 |
---|---|
O_APPEND | 每次写操作都写入文件的末尾 |
O_CREAT | 如果指定文件不存在,则创建这个文件 |
O_EXCL | 如果要创建的文件已存在,则返回 -1,并且修改 errno 的值 |
O_TRUNC | 如果文件存在,并且以只写/读写方式打开,则清空文件全部内容 |
O_NOCTTY | 如果路径名指向终端设备,不要把这个设备用作控制终端 |
O_NONBLOCK | 如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O设置为非阻塞模式 |
c库
C语言中对文件的操作需要包含头文件<stdio.h>
FILE结构体
fopen
打开文件后,需要使用如下f系列函数对文件进行操作
功能 | 函数名 |
---|---|
字符输入函数 | fgetc |
字符输出函数 | fputc |
文本行输入函数 | gets |
文本行输出函数 | fputs |
格式化输入函数 | fscanf |
格式化输出函数 | fprintf |
二进制输入 | fread |
二进制输出 | fwrite |
cpp库
C++中对文件的操作需要包含头文件<fstream>
操作文件的三大类:
ofstream: 写操作类
ifstream: 读操作类
fstream: 读写操作
文件打开的方式:文件打开方式可以配合使用,通过 “ | ”进行组合
文本写文件
操作步骤如下:
1. 包含头文件:#include<fstream>
2. 创建流对象:ofstream ofs;
3. 打开文件:ofs.open("文件路径",打开方式);
4. 写入数据:ofs << "写入的数据";
5. 关闭文件:ofs.close();
需要注意,ofs.open()函数里面的文件路径如果没有给绝对路径,就是找程序运行的路径。
例子:
#include<iostream>
#include<fstream>
using namespace std;
void test01()
{
ofstream ofs;
ofs.open("text.txt",ios::out);
ofs << "姓名:张三" << endl;
ofs << "性别:男" << endl;
ofs.close();
}
int main()
{
test01();
system("pause");
return 0;
}
文本读文件
操作步骤如下:
1. 包含头文件:#include<fstream>
2. 创建流对象:ifstream ifs;
3. 打开文件:ifs.open("文件路径",打开方式);
4. 判断文件是否打开成功:ifs.is_open();
5. 读取文本数据:【方式多样】
6. 关闭文件:ifs.close()
例子:
#include<iostream>
using namespace std;
#include<fstream>
#include<string>
void test01()
{
ifstream ifs;
ifs.open("text.txt",ios::in);
if (!ifs.is_open())
{
cout <<"文件打开失败" << endl;
return;
}
string buf;
while (getline(ifs,buf))
{
cout <<buf << endl;
}
}
int main()
{
test01();
system("pause");
return 0;
}
二进制写文件
操作方式:
1. 包含头文件:#include<fstream>
2. 创建流对象:ofstream ofs("文件路径",std::ios::out|std::ios::binary);
3. 写入数据:
二进制方式写文件主要利用流对象调用成员函数write
函数原型 :ostream& write(const char * buffer,int len);
参数解释:字符指针buffer指向内存中一段存储空间。len是读写的字节数
4. 关闭文件:ofs.close();
例子:
#include<iostream>
using namespace std;
#include<fstream>
#include<string>
class Person{
public:
char m_Name[64];
int m_Age;
};
//二进制写文件
void test01()
{
//创建输出流对象
ofstream ofs("person.txt",ios::out|ios::binary);
Person p = {"张三",18};
ofs.write((const char*)&p,sizeof(p));
ofs.close();
}
int main()
{
test01();
system("pause");
return 0;
}
二进制读文件
操作方式:
1. 包含头文件:#include<fstream>
2. 创建流对象:ifstream ifs("文件路径",std::ios::in|std::ios::binary);
3. 写入数据:
二进制方式读文件主要利用流对象调用成员函数read
函数原型:istream& read(char *buffer,int len);
参数解释:字符指针buffer指向内存中一段存储空间。len是读写的字节数
4. 关闭文件:ifs.close();
例子:
#include<iostream>
using namespace std;
#include<fstream>
#include<string>
class Person{
public:
char m_Name[64];
int m_Age;
};
//二进制写文件
void test01()
{
ifstream ifs("person.txt",ios::in|ios::binary);
if (!ifs.is_open())
{
cout <<"文件打开失败" << endl;
}
Person p;
ifs.read((char*)&p,sizeof(p));
cout <<"姓名 " <<p.m_Name <<" 年龄 " <<p.m_Age<< endl;
}
int main()
{
test01();
system("pause");
return 0;
}
文件是否存在:
bool HoloDBFile::exist(const std::string& file_name) {
#if 0
//第一种
std::ifstream ifs(file_name.c_str());
return f.good();
//第二种
if (FILE *file = fopen(name.c_str(), "r")) {
fclose(file);
return true;
} else {
return false;
}
//第三种
return ( access( name.c_str(), F_OK ) != -1 );
#endif
struct stat st;
if (stat(file_name.c_str(), &st) == 0) {
return true;
} else {
return false;
}
}
...