C 指向文件指针的指针,我该怎么做?

C 指向文件指针的指针,我该怎么做?,c,pointers,C,Pointers,为了立即解决这个问题,这是一个家庭作业,我真的很想自己解决它,所以只需回答问题,不要散布所有StackExchange的爱,并指出我代码中更多的潜在问题,我将非常感激!) 我遇到的问题是,我试图使一个指针指向一个文件指针。在我的主函数中,我创建了文件*fp;我将其传递给名为open_file()的函数。然后我想做的是将fp指针传递给我编写的另一个函数,该函数通过每个单词进行解析。这就是我正在调用的函数 int open_file(FILE * fp) { /*Open the tex

为了立即解决这个问题,这是一个家庭作业,我真的很想自己解决它,所以只需回答问题,不要散布所有StackExchange的爱,并指出我代码中更多的潜在问题,我将非常感激!)

我遇到的问题是,我试图使一个指针指向一个文件指针。在我的主函数中,我创建了文件*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,它们以以下方式定义函数

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 structIOu FILE*}'*fp=fopen(“mate.txt”,“r”);(抱歉,发布了错误的错误代码)@Salviati分配给type'FILE{aka structIOFILE}时,类型不兼容,如果您在调用程序中定义了类似FILE*fp的指针;然后调用函数ret=open_file(&fp);那么代码应该编译。@Salviati:Vlad的代码与我的代码有什么显著不同?我不知道,但我无法让它工作。这应该行得通,我同意你的看法。请给我一分钟时间再次尝试,因为我忘记了一些东西,这就是为什么它不能正确编译。完全是我的错,我也为此而斗争,一个指针指向一个指针。但是我得到了一个错误:“错误:当从type”FILE*{aka structIOu FILE*}'*fp=fopen(“mate.txt”,“r”);(抱歉,发布了错误的错误代码)@Salviati分配给type'FILE{aka structIOFILE}时,类型不兼容,如果您在调用程序中定义了类似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