заменить строку в файле с помощью C - PullRequest
1 голос
/ 20 апреля 2010

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

<img src="/images/logo.gif" ...

должно стать

<img src="/proxy/www.example.com/images/logo.gif" ...

Любой совет, как я могу подойти к этому?Возможно, существуют какие-то C-функции с «заменой строк», которые сделали бы это для меня, о чем я не знаю ...?

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

Спасибо, Христо

Ответы [ 7 ]

1 голос
/ 20 апреля 2010

Прежде всего, C - это потрясающий язык, но это один из самых болезненных языков для выполнения операций такого типа. Просто нужно было это сказать.

Можете ли вы с уверенностью предположить, что содержимое всего файла может поместиться в памяти? Если так:

allocate buffer big enough to hold file contents
read entire file into buffer
inputPtr = 0

while(inputPtr < size of buffer) {
    replacePosition = strstr(inputPtr, stringToReplace);
    if (replacePosition != NULL)
        writeUntil = replacePosition - 1
    else
        writeUntil = end of buffer

    write out buffer from inputPtr to writeUntil inclusive (could be 0 bytes)

    if (replacePosition == NULL) break

    write out the replacement string

    inputPtr = replacePosition + strlen(stringToReplace)
}
1 голос
/ 20 апреля 2010

Поскольку это домашнее задание, я предполагаю, что строка не может занимать несколько строк. Если это предположение верно (и исключает сложности с «заменой текста в HTML»), то:

1 Прочитайте следующую строку

2 Заменить строку и записать строку (в другой файл)

3 Если не в конце, перейдите к # 1

4 Win \ o /

Или, может быть, учитель хочет что-то еще пожимает плечами

1 голос
/ 20 апреля 2010

Нет, в C нет функции, которая заменяет строку в файле. Вы должны реализовать это самостоятельно.

Тем не менее, вы показываете нам HTML, а HTML хитрый, потому что он иерархический. Вы должны правильно разобрать это? Потому что, если вы, задача намного сложнее. Видя, что это домашнее задание, я сомневаюсь в этом, поэтому вы можете сделать достаточно:

  1. откройте файл и загрузите его в память (при условии, что он не слишком велик - если это так, вы можете записать во временный файл и переместить его в исходный после того, как закончите)
  2. постоянно используйте strstr, чтобы найти строку привязки, необходимую для замены
  3. заменить
  4. повторите 2 и 3, пока не закончите с файлом
  5. записать файл обратно
0 голосов
/ 20 декабря 2013

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

int main()

{

.....

replaceIPAddress( "System.cfg", "172.16.116.157", "127.0.0.1");

.....

}


void replaceIPAddress( char * confFileName, char *text_to_find , char *text_to_replace  )

{

FILE *input = fopen(confFileName, "r");

FILE *output = fopen("temp.txt", "w");

char buffer[512];


while (fgets(buffer, sizeof(buffer), input) != NULL)
{
    char *pos = strstr(buffer, text_to_find);
    if (pos != NULL)
    {
        /* Allocate memory for temporary buffer */
        char *temp = calloc(
                strlen(buffer) - strlen(text_to_find) + strlen(text_to_replace) + 1, 1);

        /* Copy the text before the text to replace */
        memcpy(temp, buffer, pos - buffer);

        /* Copy in the replacement text */
        memcpy(temp + (pos - buffer), text_to_replace, strlen(text_to_replace));

        /* Copy the remaining text from after the replace text */
        memcpy(temp + (pos - buffer) + strlen(text_to_replace),
                pos + strlen(text_to_find),
                1 + strlen(buffer) - ((pos - buffer) + strlen(text_to_find)));

        fputs(temp, output);

        free(temp);
    }
    else
        fputs(buffer, output);
}

fclose(output);
fclose(input);

/* Rename the temporary file to the original file */
rename("temp.txt", confFileName);

}
0 голосов
/ 21 апреля 2010

Вы должны изучить команду sed. Посмотрите, что он делает, и сделайте что-нибудь подобное.

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

0 голосов
/ 20 апреля 2010

Вы используете для этого функцию strcpy,

Назначьте URL в одной строке и замените его функцией strcpy.

0 голосов
/ 20 апреля 2010

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

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

buf1 -> "...<img src=\"/ima"
buf2 -> "ges/logo.gif\"..."

вы не сможете выполнить простой поиск замены в памяти.

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