С клавиатуры ввести имя файла. В указанном файле удалить все четные строки - 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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д