0

昨日は疲れすぎて、正確で具体的な質問を投稿できませんでした。それで、それは次のとおりです。

if (t==2){
    printf ("abc\n");
    printf ("abc = "); scanf ("%f",&r);
    printf ("abc = "); scanf ("%d",&n);
    printf ("abc = "); scanf ("%d",&k);
    a=2*r;
    b=2*r;
    c=2*r;

    for (i=0;i<=n;i++){
        float x=(float)rand()/((float)RAND_MAX/a);
        float y=(float)rand()/((float)RAND_MAX/b);
        float z=(float)rand()/((float)RAND_MAX/c);

        if ((x-(r))*(x-(r))+(y-(r))*(y-(r))+(z-(r))*(z-(r))<=(r*r))
            m++;

            if ( i % k ==0 && i > 0 ){
                freopen ( "data.txt","w", stdout );
                printf("%s %s      %s \n","#","n","Vka");
                Vka = ( 2*r*2*r*2*r )*m/i;
                printf("% 6.2f % 6.2f \n",n,Vka);
                fclose (stdout);
            }

    }

    Vk=(2*r*2*r*2*r)*m/n;
    printf ("abc =%d\n", m);
    printf ("abc=%d\n", n);
    printf("abc =%f", Vk);

    }

残念ながら、プログラムは動作したいので動作しません。データをファイル「data.txt」にエクスポートする必要がありますが、ファイルはまだ次のようになります。

# n      Vka 
0.00   0.00 

また、プログラムはこのファイルを作成した直後に操作を終了しますが、ターミナルで Vk を印刷する操作を終了させたいと考えています。

4

2 に答える 2

1
  1. ループの前にファイルを開く
  2. を使用してループ内のファイルに書き込みますfprintf
  3. ループ後にファイルを閉じる

このプログラムをいじる理由はまったくありませんstdout

于 2012-11-18T14:48:49.493 に答える
0

open() syscall を使用してファイルを開き、write.txtそれを fd に割り当てますfdout。次にdup2(fdout, 1)、標準出力に使用します。

に到達する前に、デフォルトで OS に 3 つの事前定義ファイル記述子が開いていますmain。標準入力
に 0、標準出力に 1、標準エラー出力に 2 が割り当てられています。

のマンページからdup2

dup2(int oldfd, int newfd)newfdのコピーになり、必要に応じて最初oldfdに閉じます。newfd

呼び出しは、開いているファイルにdup2置き換えstdoutられますwrite.txt。そのprintfため、データをstdoutに書き込むと、OS によって事前定義された fd のセットアップではなく、ファイルに書き込まれます。

これにより、仕事が完了するだけでなく、stdout の開閉に悩まされることもなくなります。

于 2012-11-18T14:36:35.130 に答える