C语言--freopen()函数及其应用

一、freopen函数

        C/C++重定向标准输入输出的库函数。

        重定向输入输出:把原本输入输出在控制台的字符,从指定的文件中读取,输出到指定的路径文件中。       

        标准声明:

FILE *freopen( const char *path,const char *mode, FILE * stream);

        参数说明:

        path:文件名,用于存储输入输出的文件名

        mode:文件打开形式(例如:读取 r (read),输出 w (write) )

        stream:文件,通常使用标准流文件(具体指 stdin(标准输入流),stdout(标准输出流), stderr(标准错误流))

                关于标准错误流(stderr)的使用:若因某种原因造成其中一个文件无法访问,相应的诊断信息要在链接的输出末尾才能打印出来,输出到屏幕上时仍可以接受,输出到一个文件时就会发生错误,若有stderr存在,即使对标准输出进行了重定向,写到stderr中的输出通常也会显示在屏幕上。

程序结束后应关闭文件,在C语言程序的末尾前应当加上关闭文件的代码(读取和输出都使用文件的情况):

        fclose(stdin);

        fclose(stdout);

二、freopen函数的使用

        以冒泡排序的代码为例说明:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int a[1000001],n;
int main()
{	
	freopen("data.txt","r",stdin); // 数据通过data.txt 输入
	freopen("bubble_out.txt","w",stdout);  // 数据通过 bubble_out.txt 输出
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)
    for(int j=i+1;j<=n;j++)
    {
        if(a[i]>a[j]){int t=a[i];a[i]=a[j];a[j]=t;}
    }
    for(int i=1;i<=n;i++) printf("%d ",a[i]);
    fclose(stdin); // 关闭文件
    fclose(stdout);
    return 0;
}

 数据的读取和输出不一定都需要使用文件(单独通过文件读取数据,通过屏幕输出的情况 另一种情况通过屏幕输入,单独通过文件输出也可以进行)

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int a[1000001],n;
int main()
{	
	freopen("data.txt","r",stdin); // 通过文件data.txt 读入
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)
    for(int j=i+1;j<=n;j++)
    {
        if(a[i]>a[j]){int t=a[i];a[i]=a[j];a[j]=t;}
    }
    for(int i=1;i<=n;i++) printf("%d ",a[i]); // 通过屏幕输出
    fclose(stdin);
    return 0;
}

三、计算程序运行的时间(clock函数)

        clock函数

        库函数:time.h

        伪代码

clock_t st,fi;
double time1;
st=clock();
/*程序运行代码*/
fi=clock();
time1=(double)(fi-st)/CLOCKS_PER_SEC; // 将时间换算成“ 秒 ”
return 0;

这种计算程序运行时间是从打开运行程序开始,到运行程序关闭,手动输入数据的时间也算入其中,因此使用文件的输入(加快输入数据的速度),能确切算出运行代码程序进行的时间

 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
int a[1000001],n;
int main()
{	
	clock_t st,fi;
	double time1;
	st=clock();
	freopen("data.txt","r",stdin);
	freopen("bubble_out.txt","w",stdout); 
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)
    for(int j=i+1;j<=n;j++)
    {
        if(a[i]>a[j]){int t=a[i];a[i]=a[j];a[j]=t;}
    }
  //  for(int i=1;i<=n;i++) printf("%d ",a[i]);
    printf("\n");
    fi=clock();
    time1=(double)(fi-st)/CLOCKS_PER_SEC; // 计算时间
    printf("%lf seconds",time1);
    fclose(stdin);
    fclose(stdout);
    return 0;
}
  • 15
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值