Посмотрите на страницу руководства для 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