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 

Morover 程序在创建此文件后完成操作,而我希望它完成在终端中打印 Vk 的操作。

4

2 回答 2

1
  1. 在循环之前打开文件
  2. 使用写入循环内的文件fprintf
  3. 循环后关闭文件

这个程序根本没有理由乱七八糟stdout

于 2012-11-18T14:48:49.493 回答
0

使用open()系统调用打开文件write.txt并将其分配给 fd,例如fdout. 然后dup2(fdout, 1)用于标准输出。

默认情况下,您的操作系统中有 3 个打开的预定义文件描述符,甚至在您到达之前main
0 分配给标准输入,1 分配给标准输出,2 分配给标准错误。

从手册页dup2

dup2(int oldfd, int newfd)成为newfd的副本,必要时先oldfd关闭。newfd

dup2调用将替换stdout为您打开的文件write.txt。因此,当您printf将数据写入 时stdout,它将被写入您的文件,而不是操作系统预先定义的 fd 设置。

这不仅可以完成您的工作,stdout 的打开和关闭不再是您的头疼。

于 2012-11-18T14:36:35.130 回答