Довести размер указанного файла до заданной длины - C (СИ)
Формулировка задачи:
Программе задаются: имя существующего текстового файла; требуемая новая длина в байтах; символ, которым необходимо осуществить заполнение.
Программа должна доводить размер указанного файла до заданной длины, если новая длина превышает уже имеющуюся длину файла, дописывая в конец файла необходимое кол-во заданных символов.
Решение задачи: «Довести размер указанного файла до заданной длины»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#define SIZE 120
int main(void)
{
printf("Enter file name: ");
char fn[SIZE], c, g;
FILE *file;
unsigned long fs, byte_size, need_size;
int i;
gets(fn);
/* Проверим существует ли файл: попытка открытия в режиме только чтение*/
if ((file = fopen(fn, "r")) == NULL) {
fprintf(stderr, "File \"%s\" doesn't exist\n", fn);
exit(1);
}
fclose(file);
/* Попытка открытия файла в режиме append(добавить) */
if ((file = fopen(fn, "a")) == NULL) {
fprintf(stderr, "Error: couldn't write file %s\n", fn);
exit(1);
}
fs = ftell(file); // просмотр количество байтов в файле
printf("Size of file \"%s\" contains %lu bytes\n", fn, fs);
printf("What size do you want? ");
scanf("%d", &byte_size);
/* Так как после вызова функции scanf() в поток переходит символ конца строки,
чтобы его отчистить создадим "замыкание"*/
while ((g = getc(stdin)) != EOF && g != '\n')
;
/* Проверка, является ли тикущий размер больше желаемого
и не является ли желаемый развмер через-чур большим */
if (byte_size < fs && byte_size < 32767) {
printf("Error: desired size less then file have or too lage\n");
exit(1);
}
printf("What symbol you want? <symbol>: ");
c = getc(stdin);
need_size = byte_size - fs;
while (need_size--) // пока need_size > 0
fputc(c, file);
fclose(file); // закрытия потока файла
return 0;
}
Объяснение кода листинга программы
- Объявление переменных:
- fn типа char массив размером SIZE для хранения имени файла;
- c типа char для хранения символа заполнения;
- g типа char для временного хранения символа конца строки;
- file указатель на файл;
- fs типа unsigned long для хранения количества байт в файле;
- byte_size типа int для хранения желаемого размера файла;
- need_size типа int для хранения количества байт, которые нужно добавить в файл.
- Ввод имени файла с помощью функции gets().
- Проверка существования файла с помощью функции fopen() в режиме чтения и вывода сообщения об ошибке в случае неудачи.
- Проверка возможности открытия файла в режиме append с помощью функции fopen() и сообщения об ошибке в случае неудачи.
- Определение текущего размера файла с помощью функции ftell().
- Вывод текущего размера файла.
- Ввод желаемого размера файла с помощью функции scanf().
- Очистка потока ввода от символа конца строки с помощью цикла while и функции getc().
- Проверка на соответствие введенного размера ограничениям (не меньше текущего размера файла и не больше 32767).
- Ввод символа заполнения с помощью функции getc().
- Расчет количества байт, которые нужно добавить в файл с помощью вычитания текущего размера файла из желаемого.
- Добавление символа заполнения в файл с помощью цикла while и функции fputc().
- Закрытие файла с помощью функции fclose().
- Завершение программы с возвратом 0.