Прочитать и записать файл побайтно - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго всем времент суток! Пршу помочь мне с небольшой проблемой. Задачка стоит простая- побайтно считать данные из одного файла и записать в другой.
    FILE *inFile;
 
    char inFileName[256];
    do {
        printf(Ansi2Oem("Введите имя декодируемого файла. Выход- пустая строка \n"));
        scanf("%s", &inFileName[0]);
        inFile = fopen(&inFileName[0], "r");
        if (inFile == NULL) {
            printf(Ansi2Oem("Невозможно открыть файл %s.\n"), inFileName);
            printf(Ansi2Oem("Неверное имя файла\n\n"));
        }
    } while (inFile == NULL);
 
    printf(Ansi2Oem("Введите имя выходного файла\n"));
    char outFileName[256];
    scanf("%s", &outFileName[0]);
 
    FILE *outFile = fopen(&outFileName[0], "w");
 
    while (!feof(inFile)) {
        char tmp = fgetc(inFile);
        fputc(decodedChar, outFile);
    }
    fclose(inFile);
    fclose(outFile);
Фигня в следующем. До последнего символа все работает на ура. Но в конце вставляется(и считывается из входного файла!) какая-то свистелкоперделка. MinGW-шный дебаггер утверждает что это символ 'я' c кодом в ASCII -1(!!!) как быть? заглянул в описание fgetc. Она возвращает int. Может быть в unsigned-стве char-а фигня? Но все предыдущее считывается нормально... Заранее спасиб овсем ответившим и откликнувшимся=)
Прошу прощения- опечатка строка 23 выглядит так fputc(tmp, outFile);

Решение задачи: «Прочитать и записать файл побайтно»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
int main(void){
    char inFileName[BUFSIZ], outFileName[BUFSIZ];
    FILE *fin, *fout;
    int ch;
    
    printf("Input file: ");
    if ( scanf("%s", inFileName) != 1 ){
        perror("scanf");
        exit(1);
    }
    printf("Output file: ");
    if ( scanf("%s", outFileName) != 1 ){
    perror("scanf");
        exit(1);
    }
    if ( ( fin = fopen(inFileName, "r") ) == NULL ){
        perror("fopen");
        exit(1);
    }
    if ( ( fout = fopen(outFileName, "w") ) == NULL ){
        perror("fopen");
        if ( fclose(fin) )
            perror("fclose");
        exit(1);
    }
    
    while ( ( ch = fgetc(fin) ) != EOF ){
        if ( fputc(ch, fout) == EOF ){
            perror("fputc");
            if ( fclose(fin) )
                perror("fclose");
            if ( fclose(fout) )
                perror("fclose");
            exit(1);
        }
    }
    if ( fclose(fin) )
        perror("fclose");
    if ( fclose(fout) )
        perror("fclose");
    exit(0);
}

Объяснение кода листинга программы

  1. Объявление переменных:
    • char inFileName[BUFSIZ], outFileName[BUFSIZ]; - массивы для ввода имени входного и выходного файлов
    • FILE fin, fout; - указатели на файлы для чтения и записи
    • int ch; - переменная для хранения прочитанного символа
  2. Сбор информации о входных параметрах:
    • printf(Input file:); - вывод запроса на ввод имени входного файла
    • scanf(%s, inFileName); - считывание имени входного файла
    • printf(Output file:); - вывод запроса на ввод имени выходного файла
    • scanf(%s, outFileName); - считывание имени выходного файла
  3. Открытие файлов:
    • if ( ( fin = fopen(inFileName, r) ) == NULL ){ - попытка открытия входного файла для чтения
    • if ( ( fout = fopen(outFileName, w) ) == NULL ){ - попытка открытия выходного файла для записи
  4. Чтение и запись файла побайтно:
    • while ( ( ch = fgetc(fin) ) != EOF ){ - чтение символа из входного файла до конца файла
    • if ( fputc(ch, fout) == EOF ){ - запись символа в выходной файл
  5. Закрытие файлов:
    • if ( fclose(fin) ) - закрытие входного файла
    • if ( fclose(fout) ) - закрытие выходного файла
  6. Выход из программы:
    • exit(0); - выход из программы с кодом завершения 0
    • exit(1); - выход из программы с кодом завершения 1

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


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

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

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