Исходный текстовый файл скопировать в результирующий текстовый файл, удалив слова менее N1 символов - C (СИ)
Формулировка задачи:
Не так давно я просил помощь в написании программы на си: Исходный текстовый файл скопировать в результирующий текстовый файл, удалив слова менее N1 символов и более N2 символов. Разделители слов - любое количество пробелов.
Получил вот такой ответ : И все бы хорошо. только мне надо скопировать не слова из файла 1 в файл 2 а весь файл. т.е. если в файле между словами будет 5 пробелов то надо (удалив необходимые слова) скопировать нужные и эти 5 пробелов и т.д., не могли бы вы мне помочь исправить этот код немного?
спасибо.
#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;
}Решение задачи: «Исходный текстовый файл скопировать в результирующий текстовый файл, удалив слова менее 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;
}
Объяснение кода листинга программы
- Подключение необходимых библиотек для работы с файлами и строками
- Определение максимальной длины слова и шаблона для форматирования
- Открытие исходного файла для чтения и результирующего файла для записи
- Проверка корректности открытия файлов и выход при ошибке
- Чтение исходного файла посимвольно с помощью функции getc
- Если символ не является буквой или цифрой, то записывается в результирующий файл
- Если длина слова больше N1 и меньше N2, то оно игнорируется
- Если длина слова меньше N1 или больше N2, то оно записывается в результирующий файл
- Закрытие исходного и результирующего файлов
- Выход из программы с результатом выполнения