Преобразовать файл, удалив каждый символ ‘*’ и повторив каждый символ, отличный от ‘*’ - C (СИ)
Формулировка задачи:
Дан текстовый файл. Преобразовать его, удалив каждый символ ‘*’ и повторив каждый символ, отличный от ‘*’.
Решение задачи: «Преобразовать файл, удалив каждый символ ‘*’ и повторив каждый символ, отличный от ‘*’»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[]) {
if (argc != 2) {
fprintf(stderr, "Udage: %s <FILE>\n", argv[0]);
return EXIT_FAILURE;
}
FILE* fsrc = fopen(argv[1], "r");
if (fsrc == NULL) {
perror(argv[1]);
return EXIT_FAILURE;
}
char tmpname[L_tmpnam];
FILE* ftmp = fopen(tmpnam(tmpname), "w");
if (ftmp == NULL) {
fclose(fsrc);
perror(tmpname);
return EXIT_FAILURE;
}
char ch;
while ((ch = fgetc(fsrc)) != EOF) {
if (ch != '*') {
fprintf(ftmp, "%c%c", ch, ch);
}
}
fclose(ftmp);
fclose(fsrc);
if (remove(argv[1]) || rename(tmpname, argv[1])) {
perror(argv[1]);
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
Объяснение кода листинга программы
- Указать, что программа написана на языке C.
- Программа принимает на вход один аргумент — имя файла.
- Открыть файл для чтения.
- Если файл не открылся, то выдать сообщение об ошибке и завершить работу программы.
- Создать временный файл для записи результатов.
- Открыть временный файл для записи.
- Если файл не открылся, то закрыть исходный файл, выдать сообщение об ошибке и завершить работу программы.
- Пройти по всем символам исходного файла.
- Если символ не равен '*', то записать его во временный файл дважды.
- Закрыть временный файл.
- Переименовать временный файл в исходное имя файла.
- Если операция переименования не удалась, то выдать сообщение об ошибке и завершить работу программы.
- Вернуть успех.