2016-12-13 5 views
1

Я нашел проблему из учебника. Давайте C от Yeshavant Kanethkar. Вопрос заключается в том, что вы должны найти ошибку в следующей программе:Ошибка обработки функции обработки файлов

#include<stdio.h> 
void openfile(char *, FILE **); 
int main() 
{ 
    FILE *fp; 
    openfile("Myfile",fp); 
    if(fp==NULL) 
     printf("Unable to open file...\n"); 
    return 0; 
} 
void openfile(char *fn, FILE **f) 
{ 
    *f=fopen(fn,"r"); 
} 

И ответ дается не «Нет ошибки», но я не уверен, потому что во время вызова открытия файла функции, мы должны называть его по ссылке:

openfile("Myfile",&fp); 

для работы с этой программой без ошибок.

Является ли мое понимание правильным, или это учебник?

+0

Что компилятор говорит вам? –

+0

'openfile (« Myfile », fp);' -> 'openfile (« Myfile », &fp);'. Ваш компилятор предупреждал вас. В предупреждениях C certains, как тот, который у вас есть, должны рассматриваться как ошибки. использовать? –

+0

Подсказка: избавиться от этой книги ... – LPs

ответ

2

Expression

openfile("Myfile", &fp); 

вместо

openfile("Myfile", fp); 

делает программа завершена.

Проблема openfile("Myfile", fp) в указательных типов: если декларация FILE *fp; получить тип FILE ** от fp вам нужен адрес указателя, и унарный & может помочь.

Компилятор может составлять компиляцию без сообщения об ошибке, поскольку и FILE *, и FILE ** являются указателями и неявным преобразованием, но обычно для таких случаев отображается предупреждение.

предупреждение My Visual Studio выглядит как:

Предупреждение 1 предупреждение C4047: 'функция': 'FILE **' отличается уровней косвенности от 'FILE *' C: \ Users \ Пользователь \ Documents \ Visual Studio 2013 \ Projects \ consoleapp \ source.c 10

UPDATE:

Попробуйте следующую обновленную программу:

#include<stdio.h> 
void openfile(char *, FILE **); 

int main() 
{ 
    FILE *fp = NULL; 
    printf("Before:\n"); 
    printf("value of fp = %p\n", fp); 
    printf("address of fp = %p\n", &fp); 
    openfile("Myfile", &fp); 
    printf("After:\n"); 
    printf("value of fp = %p\n", fp); 
    printf("address of fp = %p\n", &fp); 
    if (fp == NULL) 
     printf("Unable to open file...\n"); 
    return 0; 
} 

void openfile(char *fn, FILE **f) 
{ 
    printf("Inside (before):\n"); 
    printf("value of f = %p\n", f); 
    printf("value of *f = %p\n", *f); 
    *f = fopen(fn, "r"); 
    printf("Inside (after):\n"); 
    printf("value of f = %p\n", f); 
    printf("value of *f = %p\n", *f); 
} 

Если ваша программа может открыть файл, вы увидите что-то вроде

Before: 
value of fp = 00000000 
address of fp = 0019F9B0 
Inside (before): 
value of f = 0019F9B0 
value of *f = 00000000 
Inside (after): 
value of f = 0019F9B0 
value of *f = 580E7350 
After: 
value of fp = 580E7350 
address of fp = 0019F9B0 

Здесь мы видим адреса, и что значение fp было изменено после вызова OpenFile

+0

да! это то что. означает, что ответ неверен в книге. –

+0

Что я могу сказать ... Книги несовершенны, потому что они написаны несовершенными людьми. Возможно, в книге есть ошибка. – VolAnd

+0

, но что на самом деле есть внутри указателей файлов. –

Смежные вопросы