本文内容来源于各大佬的帖子,整合了一下,留着自己以后用,代码涉及以下几个功能
一.功能简介
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;
}