一、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;
}