Найти и заменить строку в текстовом файле и вывести в другой файл - PullRequest
0 голосов
/ 15 октября 2018

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

Это то, что я 'до сих пор закодированы.Он работает нормально, за исключением того, что в выходном файле отсутствуют пробелы и символы новой строки.

Мне нужно сохранить все пробелы и символы новой строки.Как мне это сделать?

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



using namespace std;



int main()
{
    string search = "HELLO";        //String to find
    string replace = "GOODBYE"; //String that will replace the string we find
    string filename = "";   //User-provided filename of the input file
    string temp;            //temp variable for our loop to hold the characters from the file stream
    char c;


    cout << "Input filename? ";
    cin >> filename;


    ifstream filein(filename);      //File to read from
    ofstream fileout("temp.txt");   //Temporary file


    if (!fileout || !filein)        //if either file is not available
    {
        cout << "Error opening " << filename << endl;
        return 1;
    }


    while (filein >> temp)  //While the stream continues
    {

        if (temp == search) //Check if the temp variable has captured the string we are looking for
        {

            temp = replace; //When we found the string, we substitute it with the replacement string

        }

        fileout << temp;    //Dump everything to fileout (our temp.txt file)

    }

    //Close our file streams

    filein.close();
    fileout.close();

    return 0;
}

ОБНОВЛЕНИЕ:

Я последовал вашему совету и выполнил следующее, но теперь он совсем не работает (предыдущийкод работал нормально, кроме пробелов).Не могли бы вы сказать мне, что я делаю здесь не так?Спасибо.

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



using namespace std;



int main()
{
    string search = "or";       //String to find
    string replace = "OROROR";  //String that will replace the string we find
    string filename = "";   //User-provided filename of the input file
    string temp = "";           //temp variable for our loop to hold the characters from the file stream
    char buffer;


    cout << "Input filename? ";
    cin >> filename;


    ifstream filein(filename);      //File to read from
    ofstream fileout("temp.txt");   //Temporary file


    if (!fileout || !filein)        //if either file is not available
    {
        cout << "Error opening " << filename << endl;
        return 1;
    }



    while (filein.get(buffer))  //While the stream continues
    {

        if (buffer == ' ') //check if space
        {

            if (temp == search) //if matches pattern, 
            {

                temp = replace; //replace with replace string

            }

        }

        temp = string() + buffer;

        for (int i = 0; temp.c_str()[i] != '\0'; i++)
        {
            fileout.put(temp.c_str()[i]);
        }






        return 0;
    }

}

1 Ответ

0 голосов
/ 15 октября 2018
while (filein >> temp)

Эта переменная temp является std::string.Оператор форматированного извлечения >>, перегрузка для std::string пропускает все пробельные символы (пробелы, символы табуляции, переносы строк) во входных данных и полностью их отбрасывает.Этот отформатированный оператор извлечения отбрасывает все пробельные символы до первого непробельного символа, затем извлекает его и все последующие непробельные символы и помещает их в std::string, который является этой переменной temp.Вот как это работает.

Впоследствии:

fileout << temp;

Затем эта строка записывается в вывод.В показанном коде нет ничего, что указывало бы вашему компьютеру скопировать все пустое пространство с входа на выход, как есть.Единственное, что делает показанный код, это извлекает каждую последовательность непробельных символов из входного файла, немедленно выбрасывая на пол все пробелы и символы новой строки, чтобы их больше никогда не было видно;и затем напишите, что осталось (с соответствующими изменениями) в выходной файл.И компьютер всегда будет делать именно то, что вы говорите, а не то, что вы хотите.

while (filein >> temp)

Здесь все пробелы во входном файле выбрасываются в корзину и удаляются.Поэтому вы хотите сохранить их и скопировать в выходной файл, так как вам придется заменить это.

Здесь можно использовать несколько подходов.Самое простое решение - просто прочитать входной файл по одному символу за раз.Если это не пробельный символ, добавьте его в буфер temp.Если это пробельный символ, а temp не пустой, значит, вы только что прочитали полное слово;проверьте, нуждается ли он в замене;запишите это в выходной файл;очистить буфер temp (при подготовке к чтению следующего слова);а затем вручную записать только что прочитанный символ пробела в выходной файл.Таким образом, вы будете копировать входные данные в выходные данные, по одному символу за раз, включая пробелы, но буферизуя непробельный символ в буфере temp, пока каждое полное слово не будет прочитано, прежде чем копировать его в выходной файл.И вам также понадобится обработать крайний случай обработки самого последнего слова в файле, без пробелов.

...