文件类型分为两种:

  • 文本文件:文件以文本的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

image-20230521230659018

打开文件后,需要使用如下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;
  }
}