Копирование файлов с использованием fgets вместо fgetc? - PullRequest
0 голосов
/ 21 ноября 2018

Я сделал код:

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char * argv[]) // taking files
{
    FILE * fp;
    FILE * fp2;
    int c;
.
. // checking possible problems
.
    while ( (c = fgetc(fp)) != EOF){ // copying one file to another one
        fputc (c, stdout);
        fputc (c, fp2);
    }

    fclose(fp);
    fclose(fp2);
    fp = NULL;
    fp2 = NULL;

    return EXIT_SUCCESS;
}

Я бы спросил вас, возможно ли сделать то же самое в то время как выражение с использованием функции fgets вместо fgetc - например:

fgets(fp, sizeof(fp), stdin));

1 Ответ

0 голосов
/ 21 ноября 2018

Да, можно использовать fgets() и fputs().Если вы используете системы POSIX, вы можете найти getline() лучше, чем fgets(), но вы все равно будете использовать fputs() с ним.Или вместо этого вы можете найти fread() и fwrite().Все это работает с массивами - вы можете выбрать размер, вы, вероятно, будете использовать 4096 байт в качестве размера буфера.

Например:

char buffer[4096];
while (fgets(buffer, sizeof(buffer), fp) != NULL)
{
    fputs(buffer, stdout);
    fputs(buffer, fp2);
}

Или:

char buffer[4096];
size_t nbytes;
while ((nbytes = fread(buffer, sizeof(char), sizeof(buffer), fp)) > 0)
{
    fwrite(buffer, sizeof(char), nbytes, stdout);
    fwrite(buffer, sizeof(char), nbytes, fp2);
}

Предупреждение: не скомпилированный код.

Обратите внимание, что теоретически вы должны проверить, что операции fwrite() работают нормально (коротких записей нет).Код качества производства сделает это.Вам также следует проверить, что операции fputs() также выполнены успешно.

Обратите внимание, что, как намекает на от user2357112 , исходный код будет работать с произвольными двоичными файлами (содержащимиnull bytes '\0') довольно счастливо (хотя stdout может быть менее довольным).Использование fread() и fwrite() будет отлично работать с двоичными файлами, и единственная проблема с текстовыми файлами заключается в том, что они игнорируют символы новой строки и пишут блоки текста при чтении (что обычно не является реальной проблемой).

...