【问题标题】:Insert next line after every each specific string在每个特定字符串之后插入下一行
【发布时间】:2018-03-09 04:27:02
【问题描述】:

我在一个文本文件中有一大段字符串。例如:

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

【问题讨论】:

  • 您在这方面有什么问题?如果您没有解释问题所在,就很难知道从哪里开始。
  • 我想在每个“开始”的开头插入下一行,输出将在一个新的 txt 文件中
  • 我明白你想做什么。你有什么问题?
  • 检测“开始”在它之前添加\n
  • 那么你在做什么不起作用?您在尝试时看到了什么错误?

标签: c++ string file


【解决方案1】:

我写这段代码是为了解决你的问题

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

【讨论】:

    【解决方案2】:

    我认为这是解决问题的更好方法

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

    【讨论】:

      【解决方案3】:

      嗯,我这样做的方式很奇怪。我认为阅读整个文件然后处理整个字符串会更好。我认为它会比这个更短,这相当冗长。

      #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, '\0');
          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 written\n";
          cin.ignore();
      
          return 0;
      }
      

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

      【讨论】:

        猜你喜欢
        • 2021-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-04
        • 2019-09-14
        • 1970-01-01
        • 1970-01-01
        • 2011-03-16
        相关资源
        最近更新 更多