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

时间:2016-12-11 12:30:50

标签: c pointers

为了立即解决这个问题,这是一个家庭作业,我真的想自己解决它,所以只回答问题,不要传播所有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

3 个答案:

答案 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 );

因为在这种情况下该函数将处理原始指针的副本。函数参数是其局部变量。参数副本的任何更改都不会影响参数本身。原始论点将保持不变。