Вопрос по text, file, replace, c++ – C ++ - Найти и заменить в текстовом файле (стандартные системные библиотеки)

3

Я ищу несколько советов.

My situation:

Application works with text local file.

In file are somewhere tags like this:

correct = "TEXT"
. Unfortunatelly, there can be unlimited spaces between correct, = and "TEXT".

Obtained text is testing in function and may be replaced (the change must be stored in the file).

 correct = "CORRECT_TEXT"

My current theoretical approach:

With ofstream -- read by line to string.

Find tag and make change in string.

Save strings as lines to the file.

Есть ли какой-нибудь упрощенный способ (с итераторами?) В C ++ с использованиемstandard system libraries only (Unix).

Спасибо за ваши идеи.

твой заголовок говорит C ++ твой тег говорит C? Это два разных языка, какой из них вы хотите? Jens Gustedt
@JensGustedt Извините - ошибка. В C ++, пожалуйста. Nanik
@ Влад Хорошо, спасибо. Я хотел бы использовать эффективное решение. Я, например, не знаю, возможно ли найти и заменить непосредственно в ofstream без использования вторичных строк. Nanik
Что плохого в вашем нынешнем подходе? Вроде бы все просто, и все равноofstream является частью стандартной библиотеки C ++. Vlad
Вы перезаписываете один и тот же файл или создаете новый? hmjd

Ваш Ответ

4   ответа
0

Вы уверены, что вам нужно сделать это в C ++? Поскольку вы находитесь на Unix, вы можете позвонитьsed который бы легко это сделал с помощью такой команды:

cat oldfile | sed 's/\(correct *= *\)\"TEXT\"/\1\"CORRECT_TEXT\"/' > newfile

Вы можете вызывать команды Unix из C ++, если это необходимо (например, с помощьюsystem,("command") от<cstdlib>.

Error: User Rate Limit Exceeded Nanik
4

Вот возможное решение, которое использует:

Пример:

#include <iostream>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <string>
#include <vector>

struct modified_line
{
    std::string value;
    operator std::string() const { return value; }
};
std::istream& operator>>(std::istream& a_in, modified_line& a_line)
{
    std::string local_line;
    if (std::getline(a_in, local_line))
    {
        // Modify 'local_line' if necessary
        // and then assign to argument.
        //
        a_line.value = local_line;
    }
    return a_in;
}

int main() 
{
    std::ifstream in("file.txt");

    if (in.is_open())
    {
        // Load into a vector, modifying as they are read.
        //
        std::vector<std::string> modified_lines;
        std::copy(std::istream_iterator<modified_line>(in),
                  std::istream_iterator<modified_line>(),
                  std::back_inserter(modified_lines));
        in.close();

        // Overwrite.
        std::ofstream out("file.txt");
        if (out.is_open())
        {
            std::copy(modified_lines.begin(),
                      modified_lines.end(),
                      std::ostream_iterator<std::string>(out, "\n"));
        }
    }

    return 0;
}

Я не уверен, какие именно манипуляции со строками должны быть, но вы могли бы использовать:

РЕДАКТИРОВАТЬ:

Чтобы не хранить каждую строку в памяти сразу начальнуюcopy() можно изменить, чтобы записать в альтернативный файл, а затем файлrename():

std::ifstream in("file.txt");
std::ofstream out("file.txt.tmp");

if (in.is_open() && out.open())
{
    std::copy(std::istream_iterator<modified_line>(in),
              std::istream_iterator<modified_line>(),
              std::ostream_iterator<std::string>(out, "\n"));

    // close for rename.
    in.close();
    out.close();

    // #include <cstdio>
    if (0 != std::rename("file.txt.tmp", "file.txt"))
    {
        // Handle failure.
    }
}
Error: User Rate Limit Exceededmodified_lineError: User Rate Limit Exceededstd::stringError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Nanik
Error: User Rate Limit ExceededvectorError: User Rate Limit Exceeded Nanik
Error: User Rate Limit Exceededmodified_lineError: User Rate Limit ExceededvectorError: User Rate Limit Exceeded
1

Это выглядит как «INI-файл»; синтаксис. Вы можете искать его, и у вас будет много примеров. Однако немногие из них на самом деле будут использовать C ++ stdlib.

Вот несколько советов. (Нет. Я предполагаю, что в каждой строке, которую вам нужно заменить, используется синтаксис:<parameter> = "<value_text>")

  • Use the std::string::find method to locate the '=' character.
  • Use the std::string::substr method to split the string into different chunks.
  • You'll need to create a trim algorithm to remove every blank characters in front or back of a string. (It can be done with std functions)

После всего этого вы сможете разбить строку и изолировать части, чтобы сравнить их и выполнить необходимые изменения.

повеселись !

Error: User Rate Limit Exceeded Nanik
1

Вы можете разбить задачу на крошечные кусочки и выяснить, как это сделать на C ++:

  • open a file as an input stream
  • open temporary file as an output stream
  • read a line from a stream
  • write a line to a stream
  • match a line to given pattern
  • replace text in a line
  • rename a file

Примечание. В этом случае вам не нужно хранить в памяти более одной строки за раз.

Error: User Rate Limit Exceeded Nanik

Похожие вопросы