Переписать исходный текстовый файл в результирующий задом наперед - C (СИ)
Формулировка задачи:
Написать программу, которая переписывает исходный текстовый файл в результирующий задом
наперед.
И еще 1 условие файл должен задаваться пользователем.... (т.е. никаких input output файлов быть не должно)
Предполагается, что имена файлов, с которыми имеет дело программа, передаются
ей в командной строке (через аргументы функции main()). В соответствие с этими условиями, обязатель-
на проверка правильности ввода командной строки пользователем, корректности открытия файлов и т.д.
Помогите пожалуйста для зачета надо
Решение задачи: «Переписать исходный текстовый файл в результирующий задом наперед»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
//-----------------------------------------------------------------------------
FILE* OpenFile(const char fname[], const char params[])
{
FILE* f = fopen(fname, params);
if (f == NULL)
{
perror(fname);
exit(EXIT_FAILURE);
}
return f;
}
//-----------------------------------------------------------------------------
size_t FileSize(FILE* f)
{
fseek(f, 0, SEEK_END);
size_t size = ftell(f);
fseek(f, 0, SEEK_SET);
return size;
}
//-----------------------------------------------------------------------------
char* LoadFile(const char fname[], size_t* length)
{
FILE* f = OpenFile(fname, "r");
size_t size = FileSize(f);
char* text = (char*) malloc(size + 1);
size = fread(text, 1, size, f);
text[size] = 0;
if (size == 0)
{
free(text);
text = NULL;
}
fclose(f);
if (length)
{
*length = size;
}
return text;
}
//-----------------------------------------------------------------------------
void Swap(char* a, char* b)
{
char tmp = *a;
*a = *b;
*b = tmp;
}
//-----------------------------------------------------------------------------
char* Reverse(char* begin, char* end)
{
char* text = begin;
for (; begin < end; ++begin, --end)
{
Swap(begin, end);
}
return text;
}
//-----------------------------------------------------------------------------
void WriteFile(const char fname[], const char* text, size_t length)
{
FILE* f = OpenFile(fname, "w");
fwrite(text, length, 1, f);
fclose(f);
}
//-----------------------------------------------------------------------------
int main(int argc, char* argv[])
{
if (argc != 2)
{
fprintf(stderr, "Udage: program <TEXT FILE>\n");
return EXIT_FAILURE;
}
size_t length;
char* text = LoadFile(argv[1], &length);
Reverse(text, text + length - 1);
WriteFile(argv[1], text, length);
return EXIT_SUCCESS;
}
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы
- Определяется функция для открытия файла с заданными параметрами
- Определяется функция для определения размера файла
- Определяется функция для чтения содержимого файла в строку
- Определяется функция для обмена значениями двух указателей
- Определяется функция для переворота строки
- Определяется функция для записи содержимого файла
- В функции main проверяется корректность ввода аргументов
- Если аргументов недостаточно, выводится сообщение об ошибке и возвращается код завершения
- Загружается содержимое файла в строку
- Реверсируется порядок символов в строке
- Записывается перевернутое содержимое файла обратно в файл
- Программа завершается успешно