C++ 操作文本文件
C++ 操作文本文件
C++把IO封装成类
33
操作文本文件
需要包含头文件#include <fstream>
写文件(输出流)
步骤(四步)
-
创建输出流对象
ofstream fp ; //创建输出流对象
-
打开文件,⚠打开模式缺省时如果文件不存在就创建,文件存在则截断内容
fp.open("文件路径",打开模式); //按照打开模式打开文件
文件路径注意事项:
目录文件可以使用相对路径或绝对路径
如果在windows平台下,因为' \ '为转义字符,可以使用以下方法:
- "D:\\data\\txt\\test.txt " 使用' \\ '替换' \ '
- "D:/data/txt/test.txt " 使用' / '替换' \ '
- R"(D:\data\txt\test.txt)" 使用原始字面量,C++11标准
打开模式 | 作用 |
---|---|
ios::out | 缺省值,会截断文件内容(可理解为覆盖原有内容) |
ios::trunc | 截断文件内容(可理解为覆盖原有内容) |
ios::app | 不截断文件内容,在文件尾追加内容 |
❗打开文件可能不成功,需要判断,使用 输出流对象名.is_open()
判断,打开失败返回false;打开成功返回true。
打开文件失败原因:
- 目录不存在
- 磁盘空间已满
- 没有权限(Linux平台下常见)
-
向文件中写入数据
-
关闭文件
输出流对象名.close(); //关闭文件
演示代码:
#include <iostream> #include <fstream> //操作文件
int main(){
std::ofstream file1; //1.创建输出流对象
//std::string filename = "log.txt"; //string
char filename[] = "log.txt"; //C风格字符串
//file1.open(filename); //2.打开文件,文件不存在就创建,文件存在清空内容,再写入
//file1.open(filename,std::ios::out);
//file1.open(filename,std::ios::trunc);
file1.open(filename,std::ios::app); //打开文件,文件不存在就创建,文件存在就在文件尾追加内容
//3.写入内容
if(file1.is_open() == false){ //输出流对象名.is_open()用于判断文件是否打开
std::cout << " 文件打开失败 " << std::endl;
}
else{
file1 << "春风得意马蹄疾,一日看尽长安花。\n";
file1<<" ——孟郊《登科后》\n";
std::cout << " 文件操作成功 " << std::endl;
}//4.关闭文件 file1.close(); return 0;
}
读文件(输入流)
步骤(四步)
-
创建输入流对象
ifstream fp; //创建输出流对象
-
打开文件⚠文件不存在时打开文件失败
fp.open(文件路径,打开模式);//打开模式缺省值为
ios::in
打开文件失败原因:
- 目录不存在
- 文件不存在
- 没有权限(Linux平台下常见)
- 从文件中读取数据(三种方法)
文本文件一般以行的方式组织数据
- **getline()**函数
getline(输入流对象名,缓冲区);
缓冲区需要提前定义
#include <iostream> #include <fstream>
int main(){
std::ifstream fin; //创建输入流对象
std::string filename = "log.txt";
fin.open(filename,std::ios::in); //打开文件,ios::in 为缺省值
std::string buffer; //缓冲区
//char buffer[101]; //缓冲区
if(fin.is_open() == false){
std::cout << " 文件打开失败 " <<std::endl;
}
else{
while(getline(fin,buffer)){ //使用while读取多行数据
std::cout << buffer <<std::endl;
}
std::cout << " 文件打开成功 " <<std::endl;
}
//关闭文件
fin.close();
return 0;
}
- 输入流**getline()**函数
输入流对象名.getline(缓冲区,最多读取的字节数)
⚠如果采用这种方式读取,一定要保证缓冲区足够大,超过缓冲区的部分读取不成功
#include <iostream> #include <fstream>
int main(){
std::ifstream fin; //创建输入流对象
std::string filename = "log.txt";
fin.open(filename,std::ios::in); //打开文件,ios::in 为缺省值
std::string buffer; //缓冲区
//char buffer[101]; //缓冲区
if(fin.is_open() == false){
std::cout << " 文件打开失败 " <<std::endl;
}
else{
while(fin.getline(buffer,100)){ //使用while读取多行数据
std::cout << buffer <<std::endl;
}
std::cout << " 文件打开成功 " <<std::endl;
}
//关闭文件
fin.close();
return 0;
}
- 使用**>>运算符**
输入流对象名 >> 缓冲区
⚠>>运算符从文件中读取文本内容时会将空格、制表符、换行符、视为分隔符,读取并返回下一个非空白字符之前的字符,它将跳过所有连续的空白字符,直到遇到一个非空白字符。
例如:
春风得意马蹄疾,一日看尽长安花。
——孟郊《登科后》使用>>运算符读取会变成
春风得意马蹄疾,一日看尽长安花。
——孟郊《登科后》
#include <iostream> #include <fstream>
int main(){
std::ifstream fin; //创建输入流对象
std::string filename = "log.txt";
fin.open(filename,std::ios::in); //打开文件,ios::in 为缺省值
std::string buffer; //缓冲区
//char buffer[101]; //缓冲区
if(fin.is_open() == false){
std::cout << " 文件打开失败 " <<std::endl;
}
else{
while(fin >> buffer){ //使用while读取多行数据
std::cout << buffer <<std::endl;
}
std::cout << " 文件打开成功 " <<std::endl;
}
//关闭文件
fin.close();
return 0;
}
解决**>>运算符跳过空白字符**的问题
- 使用字符串输出流操作符,它将整个文件内容读入字符串流(包括空白字符)
解决**>>运算符跳过空白字符**的问题
#include <iostream> #include <fstream> #include <sstream> //字符串流的头文件
int main(){
std::ifstream fin; //创建输入流对象
std::string filename = "log.txt";
fin.open(filename,std::ios::in); //打开文件,ios::in 为缺省值
std::string buffer; //缓冲区
//char buffer[101]; //缓冲区std::ostringstream fstr ; //字符串输出流 fstr << fin.rdbuf(); // 将整个文件内容读入字符串流 buffer = fstr.str(); // 从字符串流中获取字符串 if(fin.is_open() == false){ std::cout << " 文件打开失败 " <<std::endl; } else{ std::cout << buffer << std::endl; } //关闭文件 fin.close(); return 0;
}