Как написать в том же файле C ++ - PullRequest
0 голосов
/ 28 мая 2019

Мне нужно удалить все вхождения строки в файле. Я получаю текст в виде строки и стираю все случаи. После того, как я удалил все случаи, я не знаю, как сохранить строку обратно в файл.

Я пытался закрыть файл и остроумие ofstream для записи в него, но это не сработало.

#include <iostream>
#include <fstream>
#include <string>

int main () {
    std::string file_contents = "";
    std::ifstream myfile ("text.txt");

    char ch;

    if (myfile.is_open())
    {
        // READ FILE CONTENTS AS STRING
        while ( myfile >> std::noskipws >> ch)
        {
            file_contents += ch;
        }

        // DISPLAY STRING
        std::cout << file_contents << '\n';

        // GET WORD TO BE DELETED
        std::string word;
        std::cout << "Please enter word to be deleted: ";
        std::cin >> word;

        std::string::size_type found;

        std::string new_text;
        //DELETE WORD FROM STRING
        bool ok=0;
        do{
        found = file_contents.find(word);
        ok=1;
        if (found!=std::string::npos)
        {
            std::cout << word << " found at: " << found << '\n';
            file_contents.erase(found, word.length());
            std::cout << file_contents << '\n';

        }
        else
            ok==0;
            new_text=file_contents;
        }while(ok==1);



        myfile.close();
    }

    else std::cout << "Unable to open file";

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Самый простой способ - сначала открыть как входной поток.Когда закончите открыть как выходной поток для записиЭто не единственный способ сделать это.

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main ()
{
    std::string file_contents = "";
    {
        std::ifstream myfile ("text.txt");

        if (! myfile.is_open()) 
        {
            else std::cout << "Unable to open file";
            return 1;
        }

        // READ FILE CONTENTS AS STRING
        char ch;
        while ( myfile >> std::noskipws >> ch) file_contents += ch;
        myfile.close();
    }


    {
        std::string word;
        std::cin >> word; // GET WORD TO BE DELETED
        std::string::size_type found;
        while((found = file_contents.find(word))!=std::string::npos)
            file_contents.erase(found, word.length());

        std::ofstream myfile ("text.txt");
        myfile << file_contents<< std::flush;
        myfile.close();
    }


    return 0;
}
0 голосов
/ 28 мая 2019

Хорошо, вы должны закрыть экземпляр ifstream, прежде чем продолжить запись в файл.

После закрытия файла измените содержимое, а затем откройте тот же файл для записи, используя ofstream, и просто запишите содержимое.

#include <iostream>
#include <fstream>
#include <string>

int main() {
  std::string file_contents = "";
  std::ifstream myfile("text.txt");

  char ch;

  if (myfile.is_open())
  {
    // READ FILE CONTENTS AS STRING
    while (myfile >> std::noskipws >> ch)
    {
      file_contents += ch;
    }
    myfile.close();
  }
  else {
    std::cout << "Unable to open file";
    return -1; // no need to continue if can't read it
  }

  // DISPLAY STRING
  std::cout << file_contents << '\n';

  // GET WORD TO BE DELETED
  std::string word;
  std::cout << "Please enter word to be deleted: ";
  std::cin >> word;

  //DELETE WORD FROM STRING
  size_t found;
  while ((found = file_contents.find(word)) != file_contents.npos)
  {
    std::cout << word << " found at: " << found << '\n';
    file_contents.erase(found, word.length());
    std::cout << file_contents << '\n';
  }

  // this will open in text mode and will replace all existing content
  std::ofstream out("text.txt"); 
  if (out.is_open()) {
    out << file_contents;
    out.close();
  }
  else {
    std::cout << "Unable to open file for writing.\n";
    return -2; // for failure to open for write
  }
  return 0;
}

Примечание: цикл, который вы выполняли бесконечно, когда я пытался его выполнить, мне пришлось заменить его на код, показанный выше.Кроме того, new_text совершенно не нужно, зачем его иметь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...