С клавиатуры ввести имя файла. В указанном файле удалить все четные строки - 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;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.375 из 5
Похожие ответы