bugfix> c > 投稿

複数のファイルで関数を定義しました。以下と同じ実行に従って、同じファイルにテキストを書き込みたいです。 以下のように、異なるファイルに実行フローを書き込む方法を見つけました。

function1.h

#ifndef FUNCTION1_H_INCLUDED
#define FUNCTIONS_H_INCLUDED
int Sum(int a, int b);
#endif

function1.c

#include "function1.h"
int Sum(int a, int b)
{
    FILE *fp;
    fp = fopen("E:\\tmp\\test.txt", "a");
    fputs("Inside Sum function...\n", fp);
    fclose(fp);
    return a+b;
}

main.c

#include "stdio.h"
#include "function1.h"
int main() {
   int a=10, b=12;
   FILE *fp;
   fp = fopen("E:\\tmp\\test.txt", "a");
   fputs("Before Sum function...\n", fp);
   fclose(fp);
   printf("%d + %d = %d", a, b, Sum(a, b));
   fp = fopen("E:\\tmp\\test.txt", "a");
   fputs("After Sum function...\n", fp);
   fclose(fp);
}

複数のファイルが存在する場合、上記の解決策は非常に困難です。 直接書く方法はありますかtest.txt 複数の* .cファイルで?

回答 3 件
  • ファイルを開き、その記述子を引数のように渡すことができます。

    function1.h

    #include <stdio.h>
    #ifndef FUNCTION1_H_INCLUDED
    #define FUNCTIONS_H_INCLUDED
    int Sum(int a, int b, FILE *f);
    #endif
    
    

    function1.c

    #include "function1.h"
    int Sum(int a, int b, FILE *f)
    {
        fputs("Inside Sum function...\n", f);
        return a+b;
    }
    
    

    main.c

    #include "function1.h"
    int main() {
       int a=10, b=12;
       FILE *fp;
       fp = fopen("E:\\tmp\\test.txt", "a");
       fputs("Before Sum function...\n", fp);
       printf("%d + %d = %d", a, b, Sum(a, b, fp));
       fputs("After Sum function...\n", fp);
       fclose(fp);
       return 0;
    }
    
    

  • 引数 int Sum(int a, int b, File *F) としてファイルポインターを渡す  次に、(最後に)ファイルの先頭に戻るためにSEEK_SETにlseekできます。

  • #include <stdio.h>
    #include <stdlib.h>
    /* Define SHOW_WHERE to turn on show_where() */
    #define SHOW_WHERE
    #ifdef SHOW_WHERE
    #define show_where(fp) \
        fprintf(fp, "FILE=%s\tLINE=%d\tFUNC=%s\tDATE=%s\tTIME=%s\n", __FILE__, __LINE__, __FUNCTION__,  __DATE__, __TIME__); \
        fflush(fp);
    #else
    #define show_where(fp)
    #endif
    int main(int argc, char *argv[])
    {
        show_where(stdout);
        return 0;
    }
    
    

あなたの答え