Исходный текстовый файл скопировать в результирующий текстовый файл, удалив слова менее N1 символов - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Не так давно я просил помощь в написании программы на си: Исходный текстовый файл скопировать в результирующий текстовый файл, удалив слова менее N1 символов и более N2 символов. Разделители слов - любое количество пробелов. Получил вот такой ответ :
#include <stdio.h>
#include <string.h>
 
#define N1 5
#define N2 1
 
int main(void)
{
    FILE *ifp, *ofp;
    char word[4096];
    const char *ifname = "in.txt", *ofname = "out.txt";
    int wlen;
 
    ifp = fopen(ifname, "r");
    if(ifp == NULL || (ofp = fopen(ofname, "w")) == NULL) {
        perror("fopen");
        return 1;
    }
 
    while(fscanf(ifp, "%4095s", word) != EOF) {
        wlen = strlen(word);
        if(wlen < N1 && wlen > N2)
            continue;
        fprintf(ofp, "%s ", word);
    }
 
    fclose(ifp);
    fclose(ofp);
    return 0;
}
И все бы хорошо. только мне надо скопировать не слова из файла 1 в файл 2 а весь файл. т.е. если в файле между словами будет 5 пробелов то надо (удалив необходимые слова) скопировать нужные и эти 5 пробелов и т.д., не могли бы вы мне помочь исправить этот код немного? спасибо.

Решение задачи: «Исходный текстовый файл скопировать в результирующий текстовый файл, удалив слова менее N1 символов»

textual
Листинг программы
#include <stdio.h>
#include <ctype.h>
 
#define MAXWORD  100   /* максимальная длина слова */
 
main()
{
    FILE *ifp, *ofp;
    char word[MAXWORD];
    int c;
    size_t len;
    enum { N1 = 5, N2 = 20 };
    char patt[] = "%99s";
    
    ifp = fopen("ifile", "r");
    ofp = fopen("ofile", "w");
    
    if (!(ifp && ofp))
        return 1;
    
    while ((c = getc(ifp)) != EOF) {
        if (!isalnum(c)) {
            putc(c, ofp);
            continue;
        }
        ungetc(c, ifp);
        fscanf(ifp, patt, word);
        if ((len = strlen(word)) > N1 && len < N2)
            ;
        else
            fprintf(ofp, "%s", word); 
    }        
    
    fclose(ifp);
    fclose(ofp);
    return 0;
}

Объяснение кода листинга программы

  1. Подключение необходимых библиотек для работы с файлами и строками
  2. Определение максимальной длины слова и шаблона для форматирования
  3. Открытие исходного файла для чтения и результирующего файла для записи
  4. Проверка корректности открытия файлов и выход при ошибке
  5. Чтение исходного файла посимвольно с помощью функции getc
  6. Если символ не является буквой или цифрой, то записывается в результирующий файл
  7. Если длина слова больше N1 и меньше N2, то оно игнорируется
  8. Если длина слова меньше N1 или больше N2, то оно записывается в результирующий файл
  9. Закрытие исходного и результирующего файлов
  10. Выход из программы с результатом выполнения

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.867 из 5
Похожие ответы