1

これはおそらく些細な質問です。私はプロのプログラマーではなく、C を使用して数値実験を行っている数学者です。実験の出力を、パラメーターの値ごとに異なるファイルに書き込みたいと考えています。MWE は次のようにする必要があります。i でインデックス付けされたファイル ポインタを作成します。file[i] という名前のファイルを開きます。i をそのファイルに書き込んで閉じます。以下のコードは明らかにコンパイルされません。そのような建設は可能ですか?

#include<stdio.h>
int i;

int 
main()
{
        for (i = 0; i < 10; i++){
                FILE *f(i);
                f(i)=fopen("file"[i],"w");
                fprintf(f(i),"%d \n", i);
                fclose(f(i));  
        }
    return 0;
}

編集:私はいくつかのまともな答えを得ましたが、誰かがsprintfの問題を解決するのを手伝ってくれます. つまり、私が使用する OpenBSD では sprintf は推奨されません。だから私はこのメッセージを受け取ります

$ gcc test.c
/tmp//ccN31aTv.o(.text+0x41): In function `main':
: warning: sprintf() is often misused, please use snprintf()

sprintf を snprintf に置き換えると、あらゆる種類の警告が表示されます

$ gcc test.c
test.c: In function 'main':
test.c:9: warning: passing argument 2 of 'snprintf' makes integer from pointer without a cast
test.c:9: warning: passing argument 3 of 'snprintf' makes pointer from integer without a cast

それは私には高品質のコードのようには見えません。

最終的な解決策:最終的な解決策を文書化したいだけです。ProPolice と systrace は、OpenBSD でのこのコードに満足しています。助けてくれたみんなに感謝します!

#include<stdio.h>
int i;

char buf[20];

int
main()
{
        for (i = 0; i < 10; i++){
                snprintf(buf, sizeof(buf), "filename%d", i);
                FILE *f = fopen( buf, "w");
                fprintf(f,"%d \n", i);
                fclose(f);
        }
return 0;
}
4

4 に答える 4

4

C では、snprintf を使用します。

char buf[PATH_MAX];
snprintf(buf, sizeof(buf), "file%d", i);

Linux を使用している場合は、便利な GNU 拡張機能があります。

char *name;
asprintf(&name. "file%d", i);

使用後は必ず free(name) する必要があります。

ただし、構文FILE *f(i);は有効ではないことに注意してください。

10 要素の FILE * の配列を宣言する必要がある場合は、次のようにします。

FILE *array[10];

次に、次のように使用します。

array[i] = fopen(filename, "W");
于 2013-05-16T20:48:13.893 に答える
2

sprintfファイル名を生成するために使用します。

char buf[80];
sprintf(buf,"file%d", i);
fopen(buf,"w");

C の配列構文では、角かっこが使用されます[]

于 2013-05-16T20:45:16.743 に答える
2

で文字列を構築するだけsprintfです。バッファが十分に大きいことを確認してください:

char filename[20];
sprintf( filename, "file%d", i );

次に、次のように開くことができます。

FILE *f = fopen( filename, "w");
...
fclose(f);

f(i)一度に1つのファイルしか開いていないため、配列を使用する必要はありません(配列を使用しようとしていた場合)。

ファイルをテキストで並べ替え可能にしたい場合はfile001file002などを使用することができます.3桁までの0パッド%03dの代わりに使用できます。%d

于 2013-05-16T20:46:53.893 に答える
1

これを試すことができます:

#include <stdio.h>
#include <stdlib.h>

int main(void) {

   int i = 0;
   for (i = 0; i < 10; i++) {
      char filename[64];
      sprintf(filename, "file%d", i);    
      FILE *fp = fopen(filename, "w");
      fprintf(fp, "%d\n", i);
      fclose(fp);
   }
   return 0;
}

あなたのコードはほとんど問題ありません。いくつかの観察:

  • sprintfファイルの名前を作成するために使用します。C には、文字列の連結演算子はありません。
  • ファイル ポインターの配列を作成する必要はありません。
  • もちろん、これは改善される可能性があります。ファイル名のサイズの処理、数字のパディングなどです。
于 2013-05-16T20:48:52.667 に答える