Из строки, имеющейся в файле, удалить подстроку, введенную с клавиатуры - 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, то выходим из цикла.
- Если текущий символ равен началу подстроки, то переходим к следующей итерации цикла.
- Если текущий символ не равен началу подстроки, то записываем его в новый файл.
- Если текущий символ равен началу подстроки и текущий символ не равен последнему символу подстроки, то переходим к следующей итерации цикла.
- Если текущий символ равен началу подстроки и текущий символ равен последнему символу подстроки, то пропускаем этот символ в файле.
- Если текущий символ не равен началу подстроки, то записываем его в новый файл.
- Закрытие файлов и выход из программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д