Замена слов в файле.

// Laba4.cpp: определяет точку входа для консольного приложения.

#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <string.h>
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{setlocale(LC_ALL, "Russian");
FILE *fd = fopen("D:\\Pavel\\file.txt","r");
FILE *td = fopen("D:\\Pavel\\file2.txt","wt");
size_t readed;
char ptr[80];
readed = fread(&ptr, sizeof(char), 80, fd);
ptr[readed]=0;
cout<<ptr<<"\n";
cout<<"\n";

char buffer[200];
int i,j,pos=0;
char x[]="еще", y[]="ошибка",q[]="исчо",z[]="ошипка";
for(i=0;ptr[i];i++)
{
   for(j=0;ptr[i+j]&&q[j];j++)   //начинается ли с i-ой позиции строка a
     if(ptr[i+j]!=q[j]) break;
       if(q[j]==0)  //если a[j]=0, то мы дошли до конца строки a
        {  i+=j-1;  //в j у нас длина стоки a, которую мы перепрыгиваем
            for(j=0;x[j];j++) 
                buffer[pos++]=x[j];  //на место строки a ставим строку 
              }
        else
 {
  buffer[pos++]=ptr[i];   //просто копируем символ
 }
  buffer[pos]=NULL;  //ставим конец строки
}
strcpy(ptr,buffer);
fprintf  ( td,"%s",ptr);
fclose (td);
system("pause");
return 0;
}

Создать с помощью текстового редактора файл file.txt, длина которого не превышает 80 символов. Написать программу, которая:
выводит текст на экран;
заменяет в тексте все слова «исчо» на «еще», «ошипка» на «ошибка»;
записывает полученный текст в файл file2.txt.
У меня получилось заменить одно слово(«еще»), но со вторым не получается. Помогите пожалуйста.

Без знания используемых кодировок задача не решаема.

Павел, подправил вашу программу. Теперь работает.

#include <iostream>
#include <cstdio>
#include <cstring>
#include <Windows.h>

#pragma warning(disable : 4996)

using namespace std;

// src     входной буфер
// dest    выходной буфер
// what    строка, которую ищем
// to      строка, на которую заменяем

void replace(char *src, char *dest, char *what, char *to) {
    char *sptr = src, *septr = src, *dptr = dest;
    size_t slen = strlen(what), dlen = strlen(to);

    while (septr = strstr(sptr, what)) {
        while (septr != sptr) {
            *dptr++ = *sptr++;
        }
        strncpy(dptr, to, dlen);
        dptr += dlen;
        sptr += slen;
    }
    strcpy(dptr, sptr);
}


int main() {

    setlocale(LC_ALL, "Russian");
    SetConsoleOutputCP(1251);     // кодировка!
    SetConsoleCP(1251);           // кодировка!

    char x[] = "ещё", y[] = "ошибка", q[] = "исчо", z[] = "ошипка";
    size_t readed;
    char ptr[200], buf[200];

    FILE *fd = fopen("file-in.txt", "r");
    readed = fread(&ptr, sizeof(char), 80, fd);
    fclose(fd);
    ptr[readed] = 0;

    cout << ptr << "\n";
    cout << "\n";

    replace(ptr, buf, q, x);
    strcpy(ptr, buf);
    replace(ptr, buf, z, y);

    FILE *td = fopen("file-out.txt", "wt");
    fprintf(td, "%s", buf);
    fclose(td);
    system("pause");
    return 0;
}

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

Пришлось добавить прагму для подавления диагностики компилятора по поводу использования «устаревших» функций. Иначе у меня не компилируется вообще.

Павел, откройте мне тайну, как ваша программа измудрялась открывать файлы?

FILE *fd = fopen("D:\Pavel\file.txt","r");
FILE *td = fopen("D:\Pavel\file2.txt","wt");

Без знания используемых кодировок задача не решаема.

Без знания, конечно, тяжело. Но можно сделать некоторые предположения. Решение не универсальное, но на уровне проекта Laba4 вполне потянет.

Sam спасибо вам большое!
Программа так:
FILE fd = fopen(«D:\Pavel\file.txt»,«r»);
FILE
td = fopen(«D:\Pavel\file2.txt»,«wt»);
у меня тоже файлы не открывала.
А вот так начинала работать:
FILE fd = fopen(«D:\Pavel\file.txt»,«r»);
FILE
td = fopen(«D:\Pavel\file2.txt»,«wt»);
Дело в том что я на втором курсе учёбы, и нас учили открывать файл так:
FILE fd = fopen(«D:\Pavel\file.txt»,«r»);
FILE
td = fopen(«D:\Pavel\file2.txt»,«wt»);
А вот про кодировки в первые слышу.
Еще раз спасибо вам, буду учиться.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

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

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.