为了立即解决这个问题,这是一个家庭作业,我真的想自己解决它,所以只回答问题,不要传播所有StackExchange的爱,并在我的代码中指出更多潜在的问题,我会非常感谢! :)
我遇到的问题是我正在尝试创建一个指向文件指针的指针。在我的主要功能中,我创建了FILE * fp;我传递给一个名为open_file()的函数。我当时想要做的是将fp指针传递给我编写的另一个解析每个单词的函数。这是我打电话的功能。
int
open_file(FILE * fp)
{
/*Open the text file*/
fp = fopen("mate.txt", "r");
if(fp == NULL)
{
return 2;
}
return 0;
}
我从main()传递文件指针到这个函数的方式就像这样
ret = open_file(&fp);
编译器没有捕获错误并成功编译,但是不是扫描文件并打印出终端只是冻结的每个单词。如果我改为在open_file()中执行所有操作,那就是创建文件指针,调用解析器函数等等,如果我直接在main中打开文件,也可以。
我使用的标志是-g -Wall -Werror和-Wextra
答案 0 :(得分:2)
只需实现你的想法,引入另一层次的间接:
#include <stdio.h>
#include <assert.h>
...
int
open_file(FILE ** pfp)
{
assert(pfp != NULL);
/*Open the text file*/
*pfp = fopen("mate.txt", "r");
if (*pfp == NULL)
{
return -1; /* By convention -1 indicates failure. */
}
return 0;
}
像这样使用:
int
open_file(FILE ** pfp);
...
FILE * fp;
int ret = open_file(&fp);
Nicer将是:
int
open_file(const char * file_name, FILE ** pfp)
{
int result = 0;
assert(file_name != NULL);
assert(pfp != NULL);
*pfp = fopen(file_name, "r");
if (*pfp == NULL)
{
result = -1; /* By convention -1 indicates failure. */
}
return result;
}
答案 1 :(得分:2)
我相信在main中你将fp声明为指针,在你的情况下它不会起作用,因为你将指针传递给* fp这意味着当你打开一个文件时指向这个文件的指针是在函数open_file的堆栈上,当你失去功能,你松开了这个指针。您可以通过三种(或更多种)不同方式完成此操作:
首先是返回FILE指针:
FILE *open_file(void)
{
return fopen("mate.txt", "r");
}
FILE * fp = open_file();
或者另一种选择是将指针传递给指针* fp:
int open_file(FILE **fp)
{
/*Open the text file*/
*fp = fopen("mate.txt", "r");
if(*fp == NULL)
{
return 2;
}
return 0;
}
FILE * fp;
OPEN_FILE(安培; FP);
或者只是在主要方面:
FILE * fp = fopen(&#34; mate.txt&#34;,&#34; r&#34;);
答案 2 :(得分:1)
按以下方式定义功能
int
open_file(FILE ** fp)
{
/*Open the text file*/
*fp = fopen("mate.txt", "r");
if( *fp == NULL)
{
return 2;
}
return 0;
}
您无法定义类似
的功能int
open_file(FILE * fp)
^^^^^^^^
{
/*Open the text file*/
fp = fopen("mate.txt", "r");
if( fp == NULL)
{
return 2;
}
return 0;
}
并将其称为
open_file( fp );
因为在这种情况下该函数将处理原始指针的副本。函数参数是其局部变量。参数副本的任何更改都不会影响参数本身。原始论点将保持不变。