运行一个函数并检查是否已经使用C执行了另一个函数

运行一个函数并检查是否已经使用C执行了另一个函数,c,function,conditional-statements,call,C,Function,Conditional Statements,Call,使用C,我想在一个函数的基础上运行另一个函数。我需要检查是否执行了特定的函数。如果是,那么我希望调用时也执行此函数,否则不执行 我正在读一个文件中的一些文本。在第一个函数中,我想读取并打印它们。现在在第二个函数中,我需要一个条件,如果第一个函数被执行,那么也运行它。否则,什么也不做 我该怎么做 编辑 注意:这是完整的解决方案。问题回答之后 我的代码在这里: #include <stdio.h> static int already_run = 0; void Reading_Fu

使用C,我想在一个函数的基础上运行另一个函数。我需要检查是否执行了特定的函数。如果是,那么我希望调用时也执行此函数,否则不执行

我正在读一个文件中的一些文本。在第一个函数中,我想读取并打印它们。现在在第二个函数中,我需要一个条件,如果第一个函数被执行,那么也运行它。否则,什么也不做

我该怎么做

编辑

注意:这是完整的解决方案。问题回答之后

我的代码在这里:

#include <stdio.h>

static int already_run = 0;

void Reading_Function(FILE **rf)
{

already_run = 1;
   *rf=fopen("file.txt","r");

   if(rf==NULL)
   {
       printf("Error in file openning.");
       return 0;
   }

    char first [120];
    fscanf(*rf,"%s",first);
    printf("Value: %s", first);

}

// this is the second function

void Second_Function(FILE *rf)
{
if (already_run)
{
    char second [50];
    fscanf(rf,"%s",second);
    printf("Value: %s", second);
}
else

    return;


}

int main()
{



  char t;
  FILE *rf;
  while(scanf("%c", &t)==1)
    {
        switch(t)
        {

        case 'f' :
        Reading_Function(&rf);

        break;

        case 's' :
          Second_Function(rf);

        break;

        }
    }
    return 0;
}
#包括
静态整数已经运行=0;
无效读取功能(文件**rf)
{
已经运行=1;
*rf=fopen(“file.txt”、“r”);
如果(rf==NULL)
{
printf(“文件打开错误”);
返回0;
}
字符优先[120];
fscanf(*rf,“%s”,第一个);
printf(“值:%s”,第一个);
}
//这是第二个功能
无效第二个函数(文件*rf)
{
如果(已运行)
{
字符秒[50];
fscanf(射频,“%s”,秒);
printf(“值:%s”,秒);
}
其他的
回来
}
int main()
{
查尔特;
文件*rf;
而(scanf(“%c”,&t)==1)
{
开关(t)
{
案例“f”:
读取功能(&rf);
打破
案例s:
第二功能(rf);
打破
}
}
返回0;
}

如果问题不清楚,请告诉我。谢谢。

以上评论已经回答了您的问题。为了简单起见,代码如下所示:

static int already_run = 0;

void Reading_Function(FILE *rf) {
  already_run = 1;
  // ...
}

void Second_Function(FILE *rf) {
  if (already_run) {
    // ...
  } else {
    // ...
  }
}
也就是说,如果您试图做的只是让人们调用
Second\u函数
,但让
First\u函数
中的内容在第一次调用
Second\u函数
时运行,那么更好的方法是:

void Second_Function(FILE *rf) {
  static int already_run = 0;

  if (!already_run) {
    already_run = 1;

    // Initialization code goes here.  You can even split it out
    // into a second function if you want, in which case you would
    // just invoke that function here.
  }

  // ...
}
这样你就不用担心任何全局变量了


当然,如果代码是多线程的,这两种方法都会崩溃;在这种情况下,您应该使用once(如、、或),它将不同的API抽象出来以便于移植。

设置一个标志。如果设置了标志,请不要再这样做。我是否应该在两个函数之外设置该标志?以及如何在每个函数中调用它?您应该在函数外部定义标志,但可以在函数内部或调用该函数后在
main()
例程中进行设置。如
if(!ReadingDone){ReadingFunction(rf);ReadingDone=1;}
或类似的内容,其中
int ReadingDone=0
main()
的开头附近建立。第一个函数运行,并打印一个值。但是当我从键盘输入
s
时,它不会打印任何内容。在哪种情况下,我应该使用你上面提到的标志?不要像这样笨拙地使用
scanf
,而是坚持使用
getc
或简单的东西。还可以考虑使用
argv
而不是用户输入,这样您就可以使用相同的参数重复、轻松地调用可执行文件,从而使测试更容易、更可预测。我使用了这两种方法,不幸的是,它们都不起作用。请看一下我的代码,其他地方可能有错误。知道了。非常感谢。第二种方法现在起作用了。我会更新代码。