在每个特定字符串之后插入下一行

Insert next line after every each specific string

本文关键字:一行 插入 之后 字符串      更新时间:2023-10-16

我在文本文件中有一长块字符串。例如:

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

如果有更短或更好的方法,请告诉我。