Из строки, имеющейся в файле, удалить подстроку, введенную с клавиатуры - C (СИ)
Формулировка задачи:
Надо сделать прогу в которой из строки имеющейся в файле удалялась подстрока введенная с клавиатуры, а результат записывался в новый файл.
Вот некоторые наработки
#include <stdio.h>
#include <conio.h>
#include <string.h>
int main ()
{
int j, l, k=0, i;
int n=20, m=100;
char z[n];
char s[m];
FILE *t, *nf;
t = fopen("D:\\text.txt", "r");
if(t == NULL)//якщо файлу неіснує - помилка
{
printf("Ошибка при открытии файла.\n");
getchar ();
return 1;
}
nf = fopen ("test.txt", "w");//створюю новий файл для запису в нього строк
printf("Введите символы: ");
for(i=0;i<n;i++){
scanf("%s", &z[i]);
k++;}
for(i=0;i<m-k;i++){
for(j=0;j<k;j++)
if(z[j]!=s[i+j])
l++;
if(l==k)
i+=k;
else
fprintf(nf, "%s", s[i]);
}
fclose (t);//закриття файлів
fclose (nf);
//remove("D:\\text.txt");//видалення попереднього файла
getchar ();
return 0;
}Решение задачи: «Из строки, имеющейся в файле, удалить подстроку, введенную с клавиатуры»
textual
Листинг программы
/*из строки имеющейся в файле удалялась подстрока введенная с клавиатуры,
а результат записывался в новый файл.
*/
#include <stdio.h>
#include <string.h>
#define SIZE 256
int main()
{ FILE *in, *out;
char buf[SIZE], temp[SIZE], c;
int subDetected = 0, len;
long start;
in = fopen("text.txt", "r");
out = fopen("test.txt", "w");
if(in == NULL || out == NULL)
{ perror ("Error working with files\n");
getchar ();
return 1;
}
printf ("Enter your line:\n");
fgets (buf, SIZE, stdin);
buf[strlen(buf)-1] = '\0';
len = strlen(buf);
puts(buf);
do
{ start = ftell (in);
c = getc (in);
if (c == EOF) break;
if (c == buf[0]) //возможно, начало подстроки
{ fseek (in, start, SEEK_SET); //во входном потоке возвращаемся на одну позицию назад
fgets (temp, len+1, in); //считываем строку длиной введенной строки buf
puts(temp);
if (strcmp (buf, temp) == 0) //если строки равны
fseek (in, start + len, SEEK_SET); //пропускаем во входном потоке эту строку
else //если совпал символ, но не совпали строки
{ putc (c, out); //записываем символ в выходной поток
fseek (in, start + 1, SEEK_SET); //готовимся к считыванию следующего символа
}
}
else
putc (c, out); //обычный символ - записываем в выходной поток
} while (c != EOF);
fclose (in);
fclose (out);
getchar();
return 0;
}
Объяснение кода листинга программы
- Удаление подстроки из файла.
- Создание нового файла для записи результата.
- Чтение строки из файла и ввод с клавиатуры.
- Если введенная строка пустая, то выходим из программы.
- Инициализация переменных: файлов, строк, количества найденных подстрок.
- Поиск подстроки в файле, начиная с начала.
- Если подстрока найдена, то переходим к следующему символу в файле.
- Если подстрока не найдена, то записываем текущий символ в новый файл.
- Закрытие файлов.
- Получение символа подтверждения и выход из программы.
- Ввод с клавиатуры пустой строки.
- Чтение файла до конца.
- Переход к следующему символу в файле.
- Если текущий символ равен EOF, то выходим из цикла.
- Если текущий символ равен началу подстроки, то переходим к следующей итерации цикла.
- Если текущий символ не равен началу подстроки, то записываем его в новый файл.
- Если текущий символ равен началу подстроки и текущий символ не равен последнему символу подстроки, то переходим к следующей итерации цикла.
- Если текущий символ равен началу подстроки и текущий символ равен последнему символу подстроки, то пропускаем этот символ в файле.
- Если текущий символ не равен началу подстроки, то записываем его в новый файл.
- Закрытие файлов и выход из программы.