функция для печати содержимого текстового файла - PullRequest
0 голосов
/ 21 апреля 2020

вот код, который я написал:

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

void Print_File(FILE *f)
{

    fopen("f", "r");
    char s = fgetc(f);
    while (s != EOF)
    {
        printf("%c", s);
        s = fgetc(f);
    }
    fclose(f);
}

int main(void)
{

    FILE *ptr = fopen("info.txt", "a");
    if(ptr == NULL)
    {
        printf("Invalid Input\n");
        return 1;
    }
    char *c = malloc(sizeof(char) * 101);
    printf("One entry cannot be more than 100 characters long!\n");
    printf("Enter your text here - ");
    scanf("%[^\n]%*c", c);
    fprintf(ptr, "%s\n", c);
    fclose(ptr);
    Print_File(ptr);
    free(c);
}

После выполнения программы в командной строке, когда я вручную открываю файл, он обновляется в порядке! Но файл не распечатан! Я неправильно написал функцию Print_File ()?

1 Ответ

1 голос
/ 21 апреля 2020

Посмотрите на страницу руководства для fopen(). Он принимает имя файла в качестве первого аргумента и возвращает a FILE *. То, что вы делаете, неправильно.

Вы должны изменить это:

fopen("f", "r");

На это:

FILE *f;

f = fopen("file-name-here", "r");
if (f == NULL) {
    puts("Error opening file!");
    exit(1);
}

Во-вторых, пропуск ptr, который является закрытым Файл, для функции, бесполезен. Либо откройте ее до вызова функции (и в этот момент не используйте fopen() внутри нее), либо просто объявите функцию как не имеющую аргументов и откройте ее внутри.

Вариант 1:

void Print_File(FILE *f)
{
    // ... use already opened file ...
}


// Then in main:

ptr = fopen("file-name-here", "r");
if (ptr == NULL) {
    puts("Error opening file!");
    exit(1);
}
Print_File(ptr);

Вариант 2:

void Print_File(void) // void == takes no arguments
{
    FILE *f;
    f = fopen("file-name-here", "r");
    // ...
}

// Then in main:
Print_File();

Наконец, fgetc() возвращает int. Вам нужно использовать переменную int для хранения результата, иначе вы не сможете различить guish между действительным символом и EOF:

int s = fgetc(f);
while (s != EOF)
{
    // ...

Полный рабочий пример:

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

void Print_File(FILE *f)
{

    int s = fgetc(f);

    while (s != EOF)
    {
        printf("%c", s);
        s = fgetc(f);
    }

    fclose(f);
}

int main(void)
{

    FILE *ptr = fopen("info.txt", "a");
    if(ptr == NULL) {
        printf("Error opening file for writing.\n");
        return 1;
    }

    char *c = malloc(sizeof(char) * 101);
    if (c == NULL) {
        printf("Error allocating memory.\n");
        return 1;
    }

    printf("One entry cannot be more than 100 characters long!\n");
    printf("Enter your text here - ");
    scanf("%[^\n]%*c", c);
    fprintf(ptr, "%s\n", c);
    fclose(ptr);

    ptr = fopen("info.txt", "r");
    if(ptr == NULL) {
        printf("Error opening file for reading.\n");
        return 1;
    }

    Print_File(ptr);
    free(c);

    return 0;
}

Вывод:

$ gcc prog.c -o prog
$ ./prog
One entry cannot be more than 100 characters long!
Enter your text here - HELLO WORLD
HELLO WORLD
$ ./prog
One entry cannot be more than 100 characters long!
Enter your text here - HELLO WORLD AGAIN
HELLO WORLD
HELLO WORLD AGAIN
...