реализовать функцию копирования с использованием fscanf и fprintf - PullRequest
2 голосов
/ 03 июня 2019
  1. реализует функцию копирования, которая использует fscanf для чтения по одному символу за раз из ввода и fprintf для печати по одному символу за раз на выходе.

  2. реализует функцию копирования, которая использует fgetc для чтения по одному символу за раз из ввода и fputc для печати по одному символу за раз на выходе.

Есть ли другие способы, которыми я мог бы сделать это без использования c[BUFSIZ]?

Вот то, что я пытался закодировать:

Первый вопрос:

static void copy(FILE *input, FILE *output) {
    char c = 0;
    while (fscanf(input, "%c", &c) != 0) {
        fprintf(output, "%c", c);   
    }
}

Второй вопрос:

static void copy(FILE *input, FILE *output) {
    char c[BUFSIZ];
    while (fgets(c, BUFSIZ, input) != NULL) {
        fputs(c, output);
    }
}

Предполагается, что функция копирования будет выполнена, а детали упомянуты выше.

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

В обоих ответах есть проблемы:

  • в первом коде, вы проверяете, возвращает ли fscanf() ненулевое значение.Вместо этого вы должны проверить, возвращает ли он 1, указывая, что символ был успешно прочитан.Действительно, в конце файла fscanf() вернет EOF, что также не равно нулю.

  • во втором коде, вы должны использовать fgetc() и fputc(),не fgets() а fputs().Для этого подхода требуется один int c;.

Вот исправленные версии:

Первый вопрос:

static void copy(FILE *input, FILE *output) {
    char c;
    while (fscanf(input, "%c", &c) == 1) {
        fprintf(output, "%c", c);   
    }
}

Второй вопрос:

static void copy(FILE *input, FILE *output) {
    int c;
    while ((c = fgetc(input)) != EOF) {
        fputc(c, output);
    }
}

Обратите внимание, как c должно быть определено как char для версии fscanf() и int для подхода fgetc().fgetc() возвращает int, либо с отрицательным значением EOF, указывающим конец файла или ошибку ввода, либо значением байта, считанного из потока в виде unsigned char.

2 голосов
/ 03 июня 2019

В соответствии со вторым описанием проблемы вам необходимо использовать fgetc и fputc, при этом вам не нужен буфер.

Синтаксис'S:

int fputc(int char, FILE *pointer)
int fgetc(FILE *pointer)

fgetc() читает следующий символ из потока и возвращает его как символ без знака, приведенный к int, или EOF в конце файла или ошибки.

Именно поэтому c объявлен как int вместо char.

* ** 1 022 тысяча двадцать-один * Пример:
static void copy (FILE *input, FILE *output)
{
    int c;
    while ((c = fgetc(input)) != EOF){
        fputc(c, output);
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...