C++入坑之文本读写

本文内容来源于各大佬的帖子,整合了一下,留着自己以后用,代码涉及以下几个功能

一.功能简介

1.文件末尾写入
2.按行读取并打印
3.文本和数字分开读取
4.读取每行的第一的字符串
5.替换指定行内容
6.查找指定字符并输出所在行
7.将字符串按空格分隔开
8.指定行进行输出
9.文本行数统计

二.参考帖子

https://blog.csdn.net/weixin_43918046/article/details/106367507 //C++文件操作,读取,写入,追加写入
https://blog.csdn.net/qq_44747572/article/details/121436815 //C++ 读取txt文件中指定行的内容
https://blog.csdn.net/qing1994/article/details/22825835 //查找一个文本文件中的字符串所在的行并输出行数
https://blog.csdn.net/wangshihui512/article/details/8921926 //C++文件读写操作(三)如何统计文本的行数及如何读取文件某一行内容
https://blog.csdn.net/sinat_36219858/article/details/80369255 // c++输入文件流ifstream用法详解
https://blog.csdn.net/sinat_36219858/article/details/80380851 //c++输出文件流ifstream用法详解
https://blog.csdn.net/kingstar158/article/details/6859379 C++文件读写详解(ofstream,ifstream,fstream)
https://blog.csdn.net/lizaijinsheng/article/details/120864687 Qt中QLineEdit(取值、赋值、背景文字、字体样式)、QTextEdit(取值、赋值)和QPlainTextEdit使用介绍
https://blog.csdn.net/weixin_42915431/article/details/107893794 c/c++中输入输出处理 按分隔符(换行、逗号、空格等)读取
https://blog.csdn.net/qwer1542112264/article/details/88096470 C++将string字符串按空格分开并分别保存

三.函数调用

	int main()
{
	fstream f;
	string	ReadFile = "data.txt";
	WriteToTxt(ReadFile);  //文件末尾写入    //文件名
	cout << "修改前" << endl;
	ReadOfTxt(ReadFile);  //按行读取并打印   //文件名
	NumOrTxt(ReadFile);   //文本和数字分开读取   //文件名

	ReadFileLineFrist(ReadFile);//读取每行的第一的字符串   //文件名

	int lineNum = 3; // 要替换内容的行号
	string newText = "L09 15 12 19"; // 新的文本内容

	replaceTextInLine(ReadFile, lineNum, newText);  //替换指定行内容  //文本  行数  写入内容

	cout << "修改后" << endl;
	ReadOfTxt(ReadFile);
	cout << FindAimString(ReadFile, "M05") << endl;   //查找指定字符并输出所在行  返回值为行数  //文件名  查找的内容
	
	SpaceParttion(newText);   //将字符串按空格分隔开  存至str[]内
	*/
	cout << ReadLine(ReadFile, FindAimString(ReadFile, "M05")) << "主函数输出" << endl;  //指定行进行输出 返回值为该行内容  //文件名  //行数 
	cout << CountLines(ReadFile) << endl;   //文本行数统计 返回值行数     //文件名 
	return 0;
}

四.源码

#include<fstream>
#include <iostream>
#include <sstream>
#include <string>
#include <format>
#include <vector>

using namespace std;

//读取文件
void ReadOfTxt(string inputFile);

void ReadOfTxt(string inputFile)  //读取文件
{
	fstream n;
	int i = 0;
	//string ReadFile;
	n.open(inputFile, ios::in);
	//n << "1245454656" << endl;
	string s;
	/*
	while (n >> s)
	{	
		cout << s << endl;//显示读取内容
	}
	*/
	string temp;
	while (getline(n, temp) && i < 5)
	{
		i++;
		cout << temp << endl;
	};
	
	
		
	n.close();
	//return 0;
}


//写入文件
void WriteToTxt(string OutputFile);
void WriteToTxt(string OutputFile) //末尾写入文件
{

	fstream n;

	//string ReadFile;
	//n.open("data.txt", ios::out);//不追加,覆盖原有内容
	//n.open("data.txt", ios::out|ios::app);//追加,保留原有内容
	n.open(OutputFile, ios::out | ios::app);//追加,保留原有内容
	string in;
	cin >> in ;
	n << in << endl;

}

//数字文本分别读取
void NumOrTxt(string InputFlie);
void NumOrTxt(string InputFlie)  //数字文本分别读取
{
	fstream read;
	read.open(InputFlie, ios::in);
	int num;
	string txt;

	while (read >> txt >> num)
		cout << txt << " " << num << endl;
	

}

//找到指定数据并输出其所在的行数

int FindAimString(string inputfile,string SpecifChar);
int FindAimString(string inputfile, string SpecifChar) //找到指定数据并输出其所在的行数
{
	ifstream in(inputfile);
	//const string *target = SpecifChar;
	string tmp;
	string::size_type index = 0;//行数
	while (getline(in,tmp))
	{
		if (tmp.find(SpecifChar) != string::npos)break;
		++index;
	}
	cout << "[" << SpecifChar << "]" << "行数" << index << endl;
	return index;
}

//对指定行的数据进行输出
//存放读取行内容 按空格分隔
string ReadLine(string filename, int line)
{
	int i = 0;
	string temp;
	fstream file;
	file.open(filename, ios::in);
	//lines = 1;

	if (line < 0)
	{
		return "Error 1: 行数错误,不能为0或负数。";
	}
	if (file.fail())
	{
		return "Error 2: 文件不存在。";
	}
	/*
	if (line > lines)
	{
		return "Error 3: 行数超出文件长度。";
	}
	*/
	

	while (getline(file, temp) && i < line )
	{
		i++;
		
	}
	//string str[4];
	//istringstream is(temp);
	//is >> str[0] >> str[1] >> str[2] >> str[3];
	//cout << temp << endl;
	//cout << temp << endl;
	file.close();
	return temp;
}


/*******************************字符串按空格分隔开***********************************************/
string str[30];
void SpaceParttion(string temp)//字符串按空格分隔开

{
	istringstream is(temp);
	is >> str[0] >> str[1] >> str[2] >> str[3];
	//return str[0],str[2];


}


/*******************************字符串按空格分隔开***********************************************/




/************************************ 读取每行的第一的字符串 ************************************************************************/
void ReadFileLineFrist(string inFile) //读取每行的第一的字符串

{
	std::ifstream inputFile(inFile); // 替换input.txt为你的文件名
	std::vector<std::string> firstWords; // 存储第一个字符串的向量

	if (inputFile.is_open()) {
		std::string line;
		while (std::getline(inputFile, line)) { // 逐行读取文件内容
			std::istringstream iss(line);
			std::string firstWord;
			if (iss >> firstWord) { // 从每一行中提取第一个字符串
				firstWords.push_back(firstWord); // 将第一个字符串存储到向量中
			}
		}
		inputFile.close(); // 关闭文件
	}
	else {
		std::cerr << "Unable to open file." << std::endl; // 输出错误信息
		//return 1;
	}

	// 输出存储的第一个字符串
	std::cout << "First words from each line:" << std::endl;
	for (const auto& word : firstWords) {
		std::cout << word << std::endl;
	}

}

/************************************ 读取每行的第一的字符串 ************************************************************************/





/*****************************************************************************************************************
**修改指定行数据
*/



void replaceTextInLine(const string& filename, int lineNum, const string& newText) //修改指定行数据
{
	ifstream inputFile(filename);
	if (!inputFile.is_open()) {
		cerr << "Error: Unable to open file " << filename << endl;
		return;
	}

	string line;
	string fileContents;
	int currentLine = 0;

	while (getline(inputFile, line)) {
		++currentLine;
		if (currentLine == lineNum) {
			// 替换指定行的内容
			line = newText;
		}
		fileContents += line + '\n';
	}

	inputFile.close();

	// 将修改后的内容写回文件
	ofstream outputFile(filename);
	if (!outputFile.is_open()) {
		cerr << "Error: Unable to write to file " << filename << endl;
		return;
	}
	outputFile << fileContents;
	outputFile.close();

	cout << "Text replaced successfully in line " << lineNum << endl;
}

//调用示范
/*
int main() {
	string filename = "example.txt"; // 要处理的文件名
	int lineNum = 3; // 要替换内容的行号
	string newText = "This line has been replaced."; // 新的文本内容

	replaceTextInLine(filename, lineNum, newText);

	return 0;
}
*/



/**************************************************修改指定行数据**********************************************************************************************/





/***************************************************获取文本行数***********************************************************************************************/
int CountLines(string filename)
{
	ifstream ReadFile;
	int n = 0;
	string tmp;
	ReadFile.open(filename, ios::in);//ios::in 表示以只读的方式读取文件
	if (ReadFile.fail())//文件打开失败:返回0
	{
		return 0;
	}
	else//文件存在
	{
		while (getline(ReadFile, tmp, '\n'))
		{
			n++;
		}
		ReadFile.close();
		return n;
	}
}

/***************************************************获取文本行数***********************************************************************************************/



int main()
{
	fstream f;
	string	ReadFile = "data.txt";
	/*
	WriteToTxt(ReadFile);  //文件末尾写入    //文件名
	cout << "修改前" << endl;
	ReadOfTxt(ReadFile);  //按行读取并打印   //文件名
	NumOrTxt(ReadFile);   //文本和数字分开读取   //文件名

	//ReadFileLineFrist(ReadFile);//读取每行的第一的字符串   //文件名

	int lineNum = 3; // 要替换内容的行号
	string newText = "L09 15 12 19"; // 新的文本内容

	replaceTextInLine(ReadFile, lineNum, newText);  //替换指定行内容  //文本  行数  写入内容

	cout << "修改后" << endl;
	ReadOfTxt(ReadFile);
	cout << FindAimString(ReadFile, "M05") << endl;   //查找指定字符并输出所在行  返回值为行数  //文件名  查找的内容
	
	SpaceParttion(newText);   //将字符串按空格分隔开  存至str[]内
	*/
	//cout << ReadLine(ReadFile, FindAimString(ReadFile, "M05")) << "主函数输出" << endl;  //指定行进行输出 返回值为该行内容  //文件名  //行数 
	cout << CountLines(ReadFile) << endl;   //文本行数统计 返回值行数     //文件名 

	//string i = ReadLine(ReadFile, 1);
	//
	/*
	string Spechar;
	cin >> Spechar;
	FindString(ReadFile, Spechar);
	ReadLine(ReadFile, index);
	cout << str[3] << "\n";
	string WriteC;

	
	while (true)
	{
		int n;

		cin >> n;
		cout << str[n]<<"\n";
	}
	*/
	//cin >> WriteC;
	//WriteToTxt(ReadFile);

	//ReadOfTxt(ReadFile);
	f.close();//关闭文档
	return 0;


}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值