С клавиатуры ввести имя файла. В указанном файле удалить все четные строки - C (СИ)
Формулировка задачи:
С клавиатуры ввести имя файла. В указанном файле удалить все четные строки.
Решение задачи: «С клавиатуры ввести имя файла. В указанном файле удалить все четные строки»
textual
Листинг программы
/*
============================================================================
Name : c_odd_rows_file.c
Author : UranFlex
Version : 0.1 alpha
Copyright : Your copyright notice
Description : С клавиатуры ввести имя файла. В указанном файле удалить все четные строки.
* Нумерация строк в файле начинается с единицы.
* Общий смысл:
* 1) Cоздаем файл назначения - в него записываем посимвольно нечетные строки исходного файла.
* 2) Удаляем исходный фал
* 3) Переименовываем файл назначения - даем ему имя исходного файла.
* C, Ansi-style.
============================================================================
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TEMP "temp" // временное имя файла назначения
#define LENNAME 255 // длина имени обрабатываемого файла
int main( void ) {
// получаем от пользователя имя файла
puts( "Введите имя файла" );
char fSrcName[ LENNAME ];
gets( fSrcName );
FILE* pfSrc = fopen( fSrcName, "r" ); // пытаемся исходный открыть файл для чтения
// обрабатываем ошибку открытия файла
if ( pfSrc == NULL ) {
perror( "Ошибка при открытии исходного файла" );
return EXIT_FAILURE;
}
FILE* pfDest = fopen( TEMP, "w" ); // пытаемся создать и открыть файл назначения для записи
// обрабатываем ошибку открытия файла
if ( pfSrc == NULL ) {
perror( "Ошибка при создании файла назначения" );
return EXIT_FAILURE;
}
unsigned num = 1; // номер очередной считываемой строки
int ch; // очередной считываемый символ
while ( ( ch = fgetc( pfSrc ) ) != EOF ) { // в цикле посимвольно считываем файл до конца файла
if ( ch != '\n' ) { // если прочитали очередной символ и он НЕ конец строки
// и если строка четная
if ( !( num % 2 ) )
continue; // то возвращаемся к началу цикла - читаем следующий символ четной строки, пока не найдем конец строки.
// а если же строка нечетная, то пишем ее символ в файл назначения.
fputc( ch, pfDest );
} else { // если очередной символ все же является концом строки, то
++num; // увеличиваем счетчик строк - чтобы в следующей итерации цикло мы знали, что уже читаем символы следующей строки
if ( num % 2 ) // тут проверяем, что следующая строка будет нечетная, значит текущая четная
continue; // возвращаемся к началу цикла чтобы считать - т.е. считываем первый символ следующей уже нечетной строки
// если же текущая строка нечетная и мы считали конец строки, значит запишем его в файл назначения
fputc( ch, pfDest );
}
}
// закрываем оба файла
fclose( pfDest );
fclose( pfSrc );
// удаляем исходный файл и переименовываем файл назначения - даем ему имя исходного файла
if ( ( remove( fSrcName ) == 0 ) && ( rename( TEMP, fSrcName ) == 0 ) )
printf( "Удаление четных строк произведено успешно!\n" );
else{
perror( "Ошибка при обработке файла" );
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}