首页 > 编程语言 >C++ 操作文本文件

C++ 操作文本文件

时间:2023-07-21 10:13:08浏览次数:34  
标签:std 文件 open ios C++ filename 文本文件 操作 fin

image

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。

打开文件失败原因:

  1. 目录不存在
  2. 磁盘空间已满
  3. 没有权限(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

打开文件失败原因:

  1. 目录不存在
  2. 文件不存在
  3. 没有权限(Linux平台下常见)
  • 从文件中读取数据(三种方法)

文本文件一般以行的方式组织数据

  1. **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;
}

  1. 输入流**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;
}

  1. 使用**>>运算符**

输入流对象名 >> 缓冲区

>>运算符从文件中读取文本内容时会将空格、制表符、换行符、视为分隔符,读取并返回下一个非空白字符之前的字符,它将跳过所有连续的空白字符,直到遇到一个非空白字符。

例如:

春风得意马蹄疾,一日看尽长安花。
——孟郊《登科后》

使用>>运算符读取会变成

春风得意马蹄疾,一日看尽长安花。

——孟郊《登科后》

#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;
}

解决**>>运算符跳过空白字符**的问题

  1. 使用字符串输出流操作符,它将整个文件内容读入字符串流(包括空白字符)

解决**>>运算符跳过空白字符**的问题

#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 &lt;&lt; fin.rdbuf();	// 将整个文件内容读入字符串流
buffer = fstr.str();  		// 从字符串流中获取字符串

if(fin.is_open() == false){
	std::cout &lt;&lt; &quot; 文件打开失败 &quot; &lt;&lt;std::endl;
}
else{
	std::cout &lt;&lt; buffer &lt;&lt; std::endl;
}
//关闭文件
fin.close();
return 0;

}

标签:std,文件,open,ios,C++,filename,文本文件,操作,fin
From: https://www.cnblogs.com/huajianyizou/p/c-operating-text-file-z1wwrcc.html

相关文章

  • Django基本数据库操作
    Django基本数据库操作@目录Django基本数据库操作......
  • C++的四种强制类型转换
    将类型名作为强制转换的语法是C语言保留下来的,C++有自己独有的类型转换,就是四种cast。它们都有着统一的语法,即xx_cast<typename>(expression),可以将expression转换成typename的类型。static_cast顾名思义,静态转换,通常用于内置类型的转换。但是不能用于不同类型的指针/引用之间......
  • C++ 不用现成的类库 实现两个非负整数的字符串的和
    给定两个非负整数的字符串num1 和num2 ,返回num1与num2的和Note: num1 和num2 长度都小于5100. num1 和num2 只包含0-9的数字.num1 和num2 开头不为0.不能用现成的类库直接将输入的字符串转换成整数思路:从低位开始遍历相加,和≥10标记add_val=1,<10标记add_val=......
  • C++数值计算——矩阵类的实现(一)
    本系列博客将利用C++实现一系列数值算法。数值算法离不开矩阵,但是C++并未自带矩阵这一对象,直接使用数组又会带来诸多不便,因此我们需要做一些预备工作————编写一个矩阵类,实现矩阵的基本功能。一般来说,读者可以直接使用Eigen库进行矩阵计算,从头开始造轮子仅仅是为了满足笔者个人......
  • 7.20 c++
    //高精度加法#include<bits/stdc++.h>usingnamespacestd;intmain(){chara1[5005],b1[5005];inta[5005],b[5005],c[5005];intla,lb,lc=1,x=0,i;memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(c,0,sizeof(c));c......
  • c++ day 13
    今天来认识c++里面的迭代器C++迭代器(Iterator)是一种用于遍历容器(如数组、向量、链表等)中元素的抽象概念。它允许你通过简单的接口在容器中移动,并访问容器中的元素,而无需了解底层数据结构的细节。迭代器提供了一种统一的方式来访问不同类型容器的元素,使得代码更加灵活和可复用。......
  • 对 Word 文档进行操作的 .NET 类库
    如何使用.NET类库操作Word文档简介在.NET开发中,我们可以使用MicrosoftOffice的COM组件来操作Word文档。COM(ComponentObjectModel)是一种微软提供的组件对象模型,它允许我们在不同的应用程序之间进行交互。通过使用COM组件,我们可以通过编写.NET代码来控制Word,并......
  • C++Const变量的存储位置
    const变量/对象的存储位置const局部变量const局部基础变量和自定义变量都存储在栈上structdiy_class{inta;intb;diy_class(inta,intb):a(a),b(b){}};intmain(){intb=1;//这个肯定在栈上constinta=10;//比较ab两个变......
  • C++架构师 课程目录
    C++架构师课程目录实现指南规划流程在实现"C++架构师课程目录"之前,我们需要先规划整个流程。以下是实现该功能的步骤:步骤描述1.创建课程目录类创建一个C++类来表示课程目录,并定义相关的成员变量和方法。2.添加课程实现向课程目录中添加课程的功能。3.删除课......
  • C++ 模板编程技术解析
    一、函数模板函数模板实现通用函数,根据传递类型进行编译时实参推导:template<typenameT>Tadd(Ta,Tb){returna+b;}intmain(){intx=1,y=2;doublem=1.5,n=2.5;intz=add(x,y);doublep=add(m,n);return0;}这里te......