Прочитать и записать файл побайтно - C (СИ)
Формулировка задачи:
Доброго всем времент суток! Пршу помочь мне с небольшой проблемой. Задачка стоит простая- побайтно считать данные из одного файла и записать в другой.
Фигня в следующем. До последнего символа все работает на ура. Но в конце вставляется(и считывается из входного файла!) какая-то свистелкоперделка. MinGW-шный дебаггер утверждает что это символ 'я' c кодом в ASCII -1(!!!) как быть?
заглянул в описание fgetc. Она возвращает int. Может быть в unsigned-стве char-а фигня? Но все предыдущее считывается нормально...
Заранее спасиб овсем ответившим и откликнувшимся=)
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);
Прошу прощения- опечатка
строка 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); }
Объяснение кода листинга программы
- Объявление переменных:
- char inFileName[BUFSIZ], outFileName[BUFSIZ]; - массивы для ввода имени входного и выходного файлов
- FILE fin, fout; - указатели на файлы для чтения и записи
- int ch; - переменная для хранения прочитанного символа
- Сбор информации о входных параметрах:
- printf(
Input file:
); - вывод запроса на ввод имени входного файла - scanf(
%s
, inFileName); - считывание имени входного файла - printf(
Output file:
); - вывод запроса на ввод имени выходного файла - scanf(
%s
, outFileName); - считывание имени выходного файла
- printf(
- Открытие файлов:
- if ( ( fin = fopen(inFileName,
r
) ) == NULL ){ - попытка открытия входного файла для чтения - if ( ( fout = fopen(outFileName,
w
) ) == NULL ){ - попытка открытия выходного файла для записи
- if ( ( fin = fopen(inFileName,
- Чтение и запись файла побайтно:
- while ( ( ch = fgetc(fin) ) != EOF ){ - чтение символа из входного файла до конца файла
- if ( fputc(ch, fout) == EOF ){ - запись символа в выходной файл
- Закрытие файлов:
- if ( fclose(fin) ) - закрытие входного файла
- if ( fclose(fout) ) - закрытие выходного файла
- Выход из программы:
- exit(0); - выход из программы с кодом завершения 0
- exit(1); - выход из программы с кодом завершения 1
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д