前言
C++中,文件操作属于技术的应用,不是基本语法
程序运行的时候数据存储在内存中
程序没有运行的时候
数据持久化的两种方式:文件和数据库
在实际开发中,文件操作无处不在
文件操作属于IO
IO类继承关系
写入文本文件
文本文件一般以行的形式组织数据
包含头文件#include <fstream>
类ofstream
新建文件写入
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ofstream fout; //创建文件输出流对象
fout.open("test.txt"); //打开文件,如果文件不存在,则创建它;如果文件已存在,则截断其内容
//向文件中写入数据
fout << "xxx" << endl;
fout << "yyy" << endl;
fout << "zzz" << endl;
fout.close(); //关闭文件,fout对象失效前会自动调用close()
cout << "文件操作完成" << endl;
}
程序在哪个目录运行,生成的文件就在哪个目录
open()成员函数的参数,可以用c风格的字符串,也可以用string
open()函数有重载,两种参数都支持
#include <iostream>
#include <fstream>
using namespace std;
string filename = "test.txt";
//char filename[] = "test.txt";
int main()
{
ofstream fout; //创建文件输出流对象
fout.open(filename); //打开文件,如果文件不存在,则创建它;如果文件已存在,则截断其内容
//向文件中写入数据
fout << "xxx" << endl;
fout << "yyy" << endl;
fout << "zzz" << endl;
fout.close(); //关闭文件,fout对象失效前会自动调用close()
cout << "文件操作完成" << endl;
}
指定文件写入
在实际开发中,一般会把数据文件夹存放在指定目录
所以filename要用文件的全路径,不能只是文件名
#include <iostream>
#include <fstream>
using namespace std;
string filename = "D:\\data\\txt\\test.txt";
//char filename[] = "test.txt";
int main()
{
ofstream fout; //创建文件输出流对象
fout.open(filename); //打开文件,如果文件不存在,则创建它;如果文件已存在,则截断其内容
//向文件中写入数据
fout << "xxx" << endl;
fout << "yyy" << endl;
fout << "zzz" << endl;
fout.close(); //关闭文件,fout对象失效前会自动调用close()
cout << "文件操作完成" << endl;
}
C++中\
用于转义,可以用\\
其他写法
R"(D:\data\txt\test.txt) //原始字面量
"D:/data/txt/test.txt" //用反斜杠
"/data/txt/test.txt" //Linux中
打开文件,可以用open()成员函数
也可以在ofstream fout的时候,传入文件名
ofstream fout(filename);
ofstream类有重载的构造函数,在函数中会打开文件
#include <iostream>
#include <fstream>
using namespace std;
string filename = "D:\\data\\txt\\test.txt";
//char filename[] = "test.txt";
int main()
{
ofstream fout(filename); //创建文件输出流对象
//fout.open(filename); //打开文件,如果文件不存在,则创建它;如果文件已存在,则截断其内容
//向文件中写入数据
fout << "xxx" << endl;
fout << "yyy" << endl;
fout << "zzz" << endl;
fout.close(); //关闭文件,fout对象失效前会自动调用close()
cout << "文件操作完成" << endl;
}
打开模式
打开模式
如果文件已经存在,打开模式可以决定是否清空原文件内容
ios::out 缺省值,会截断文件内容
ios::trunc 截断文件内容
ios::app 不截断文件内容,只在文件末尾追加文件
这三行代码效果一样
ofstream fout(filename);
ofstream fout(filename, ios::out);
ofstream fout(filename, ios::trunc);
用open函数和构造函数是一样的
判断打开文件是否成功
判断打开文件是否成功
if (fout.is_open() == false)
{
cout << "打开文件" << filename << "失败" << endl;
return 0;
}
失败的原因主要有
- 目录不存在
- 磁盘空间已满
- 没有权限,Linux中常见
读取文本文件
#include <iostream>
#include <fstream>
using namespace std;
string filename = "D:\\data\\txt\\test.txt";
//char filename[] = "test.txt";
int main()
{
ifstream fin; //创建文件输出流对象
fin.open (filename, ios::in);
if (fin.is_open() == false)
{
cout << "打开文件" << filename << "失败" << endl;
return 0;
}
//读取文件内容
fin.close(); //关闭文件,fin对象失效前会自动调用close()
cout << "文件操作完成" << endl;
}
输入流只有一种打开模式
ios::in
缺省值,这个参数填不填都一样
ifstream fin(filename);
ifstream fin(filename, ios::in);
读取文件内容代码
文本文件一般以行的方式组织数据
所以读取数据的时候要一行一行地读
从输入流中读取一行数据,可以用getline()
函数
需要包含string
头文件
string buffer;
getline(fin, buffer);
从文件中读取一行数据,存放在buffer中
读取文件全部内容
如果想要读取文件中全部数据,要用一个while循环
方法一
while (getline(fin, buffer))
{
cout << buffer << endl;
}
把文件的内容一行一行读出来,放到buffer中
如果文件结束了,getline会返回空
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
string filename = "test.txt";
//char filename[] = "test.txt";
int main()
{
ifstream fin; //创建文件输出流对象
fin.open (filename, ios::in);
if (fin.is_open() == false)
{
cout << "打开文件" << filename << "失败" << endl;
return 0;
}
//读取文件内容
string buffer;
while (getline(fin, buffer))
{
cout << buffer << endl;
}
fin.close(); //关闭文件,fin对象失效前会自动调用close()
cout << "文件操作完成" << endl;
}
方法二
char buffer[101]; //存放从文件中读取的内容
//如果采用ifstream.getline(),一定要保证缓冲区足够大
while (fin.getline(buffer, 100))
{
cout << buffer << endl;
}
getline()是输入流ifstream的成员函数,不是全局函数
参数也不同,第二个参数是最多读取内容的字节数
buffer是c风格的字符串,不能扩展,要保证足够大
方法三
string buffer;
while (fin >> buffer)
{
cout << buffer << endl;
}
会间隔空格和换行符读取