在每个特定字符串之后插入下一行
Insert next line after every each specific string
我在文本文件中有一长块字符串。例如:
asdasdas**Start**sadasdsadasdasd**End**45646546466516asdsadasd**Start**asdsfsdfsdfdsfdsfds**End**
如何在每Start
之前插入下一行(n
(?
std::ifstream in("example.txt");
std::ofstream out("example2.txt");
std::string line;
也许我可以将结果输出到example2.txt
.
我写这段代码是为了解决你的问题
std::ifstream in("example.txt");
std::ofstream out("example2.txt");
string line;
if (in)
{
int searchedindex = 0;
in >> line;
std::size_t found;
while (true)
{
found = line.find("Start", searchedindex);
if (found == std::string::npos)
{
break;
}
else
{
line.insert(line.begin() + found, 'n');
searchedindex = found + 2;
}
}
in.close();
}
if (out)
{
out << line;
out.close();
}
我认为这是解决问题的更好方法
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>
#include <array>
#include <cstring>
int main(int argc, char* argv[])
{
const char *pTarget = "Start";
const size_t targetLen = std::strlen("Start");
const size_t maxReserveNum = targetLen - 1;
std::array<char, 64 * 1024> readBuffer;
std::ifstream inFile("F:\example.txt");
std::ofstream outFile("F:\example2.txt");
size_t reserveNum = 0;
while (inFile.read(readBuffer.data() + reserveNum, readBuffer.size() - reserveNum), inFile.gcount() != 0)
{
const char *nextWritePos = readBuffer.data();
const char *dataEndPos = nextWritePos + static_cast<size_t>(inFile.gcount()) + reserveNum;
for (const char *targetPos = std::strstr(nextWritePos, pTarget);
targetPos != nullptr;
targetPos = std::strstr(nextWritePos, pTarget))
{
outFile.write(nextWritePos, targetPos - nextWritePos);
outFile.write("n", 1);
outFile.write(pTarget, targetLen);
nextWritePos = targetPos + targetLen;
}
const size_t remainderSize = dataEndPos - nextWritePos;
reserveNum = std::min<size_t>(remainderSize, maxReserveNum);
outFile.write(nextWritePos, remainderSize - reserveNum);
std::memcpy(readBuffer.data(), dataEndPos - reserveNum, reserveNum);
}
outFile.write(readBuffer.data(), reserveNum);
return 0;
}
嗯,我以一种相当奇怪的方式这样做。我认为最好阅读整个文件,然后处理整个字符串。我以为它会比这短,这是相当冗长的。
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
const char* testString = "StartmumbojumboandfillerEnd Start fillerfillerfiller End"
" StartrandomrandomrandomEndStartstuffstuffstuffEnd Start more more more End";
int main()
{
ifstream infile("file.txt", ios::ate | ios::binary);
if (!infile) return 0;
size_t size = infile.tellg();
infile.seekg(0);
string fullFile(size, ' ');
infile.read(&fullFile[0], size);
fullFile = testString; // Use test string instead of file.
size_t start = 0;
size_t end = 0;
string substr;
int count = 0;
do
{
start = fullFile.find("Start", end); // Will start reading only from first "Start"
if (start != string::npos) // If Start found
{
start += strlen("Start"); // Skip "Start"
end = fullFile.find("End", start); // Find "End"
if (end == string::npos) throw("Failed to find end token");
substr = fullFile.substr(start, end - start);
substr += 'n';
start = end + strlen("End"); // Move "start" pos past "End" to continue
count++;
ofstream outFile("file" + to_string(count) + ".txt", ios::binary);
outFile.write(substr.data(), substr.size());
cout << substr << 'n';
}
} while (start != string::npos);
cout << count << "Files writtenn";
cin.ignore();
return 0;
}
如果有更短或更好的方法,请告诉我。
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 预处理器:插入结构名称中的前一个行号
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 在未初始化映射的情况下,将值插入到映射的映射中
- 从C++dll访问C#中的一行主要参数
- 如何在c++中只将键插入到bimap的一侧
- 如何将结构插入到集合中并打印集合的成员
- C++json插入数组
- 我可以在一行代码中将向量中与条件匹配的所有元素插入到集合中吗?
- 在每个特定字符串之后插入下一行
- 如何在Visual Studio 2013 Ultimate Edition中包含某个单词的每一行中插入断点
- 从.txt文件中读取一行,然后插入变量
- 在 MySQL 中使用 MFC 对话框基础应用的C++插入一行
- C++在文件中的一行中搜索某些单词,然后在这些单词后面插入一个单词
- 最有效的方式插入一行bool值到原始数组
- 在一行中插入多个无空格的整数
- C++ 在文件中的特定点插入一行