C 指向文件指针的指针,我该怎么做?
为了立即解决这个问题,这是一个家庭作业,我真的很想自己解决它,所以只需回答问题,不要散布所有StackExchange的爱,并指出我代码中更多的潜在问题,我将非常感激!) 我遇到的问题是,我试图使一个指针指向一个文件指针。在我的主函数中,我创建了文件*fp;我将其传递给名为open_file()的函数。然后我想做的是将fp指针传递给我编写的另一个函数,该函数通过每个单词进行解析。这就是我正在调用的函数C 指向文件指针的指针,我该怎么做?,c,pointers,C,Pointers,为了立即解决这个问题,这是一个家庭作业,我真的很想自己解决它,所以只需回答问题,不要散布所有StackExchange的爱,并指出我代码中更多的潜在问题,我将非常感激!) 我遇到的问题是,我试图使一个指针指向一个文件指针。在我的主函数中,我创建了文件*fp;我将其传递给名为open_file()的函数。然后我想做的是将fp指针传递给我编写的另一个函数,该函数通过每个单词进行解析。这就是我正在调用的函数 int open_file(FILE * fp) { /*Open the tex
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,它们以以下方式定义函数
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 );
因为在这种情况下,函数将处理原始指针的副本。函数参数是它的局部变量。参数副本的任何更改都不会影响参数本身。原始参数将保持不变。按以下方式定义函数
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 );
因为在这种情况下,函数将处理原始指针的副本。函数参数是它的局部变量。参数副本的任何更改都不会影响参数本身。原始论点将保持不变。因此,为了实现您的想法,引入另一个间接层次:
#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(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;
}
为了实现您的想法,引入另一个间接层次:
#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(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;
}
我相信在main中,您将fp声明为指针,在您的情况下,它将不起作用,因为您将指针传递给*fp,这意味着当您打开一个文件时,指向该文件的指针位于函数open_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;
}
文件*fp
打开\u文件(&fp)
或者简单地说:
文件*fp=fopen(“mate.txt”,“r”)
我相信在main中,您将fp声明为指针,在您的情况下,它将不起作用,因为您将指针传递给*fp,这意味着当您打开一个文件时,指向该文件的指针位于函数open_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;
}
文件*fp
打开\u文件(&fp)
或者简单地说:
文件*fp=fopen(“mate.txt”,“r”)
我也为此而斗争,一个指针指向一个指针。但是我得到了一个错误:“错误:当从type”FILE*{aka structIOu FILE*}'*fp=fopen(“mate.txt”,“r”);(抱歉,发布了错误的错误代码)@Salviati分配给type'FILE{aka structIOFILE}时,类型不兼容,如果您在调用程序中定义了类似FILE*fp的指针;然后调用函数ret=open_file(&fp);那么代码应该编译。@Salviati:Vlad的代码与我的代码有什么显著不同?我不知道,但我无法让它工作。这应该行得通,我同意你的看法。请给我一分钟时间再次尝试,因为我忘记了一些东西,这就是为什么它不能正确编译。完全是我的错,我也为此而斗争,一个指针指向一个指针。但是我得到了一个错误:“错误:当从type”FILE*{aka structIOu FILE*}'*fp=fopen(“mate.txt”,“r”);(抱歉,发布了错误的错误代码)@Salviati分配给type'FILE{aka structIOFILE}时,类型不兼容,如果您在调用程序中定义了类似FILE*fp的指针;然后调用函数ret=open_file(&fp);那么代码应该编译。@Salviati:Vlad的代码与我的代码有什么显著不同?我不知道,但我无法让它工作。这应该行得通,我同意你的看法。请给我一分钟时间再次尝试,因为我忘记了一些东西,这就是为什么它不能正确编译。完全是我的错,不要在函数中硬编码文件名。取而代之的是,把它作为一个论点来传递,这样你就不想提高你的编码技能,也不想从有经验的用户的知识中获益了?你应该改变你的态度。这个函数有点无用。为什么你不返回fp呢?按照库操作,并在出现错误时返回NULL。为什么要传递一个参数呢?即使:通过
const char*
@Salviati传递文件名,我认为这是你的问题,不要在函数中硬编码文件名。取而代之的是,把它作为一个论点来传递,这样你就不想提高你的编码技能,也不想从有经验的用户的知识中获益了?你应该改变你的态度。这个函数有点无用。为什么你不返回fp呢?按照库操作,并在出现错误时返回NULL。为什么要传递一个参数呢?即使:通过const char*
@Salviati读取此文件,我认为这是您的问题,谢谢!编辑:你知道为什么我不能只做文件**fp吗?@Salviati:pfp
,fp
,wtf
。。只是名字而已。。随便你怎么说,这些名字在编译之后就不见了!;-)@Salviati:您想了解这个*
-运算符(也称为“解引用”-运算符)实际执行的操作。@Salviati:pfp
是一个局部变量。如果你直接写信给它,t