freopen和fopen的在ACM竞赛中的简单使用

在程序设计竞赛中,当我们遇到需要大量的输入数据情况下就可以采用文件的方式来存储我们的输入数据,为下次调试程序时节省了很多时间;

首先我们来说下freopen()这个函数,

1.它是c标准库中的函数,也就是#include<stdio.h>;

C89函数声明:
FILE *freopen( const char *filename, const char *mode, FILE *stream );[1]
C99函数声明:
FILE *freopen(const char * restrict filename, const char * restrict mode, FILE * restrict stream);[2]
形参说明:
filename:需要重定向到的文件名或文件路径。
mode:代表文件访问权限的字符串。例如,"r"表示“只读访问”、"w"表示“只写访问”、"a"表示“追加写入”。
stream:需要被重定向的文件流。
返回值:如果成功,则返回该指向该输出流的文件指针,否则返回为NULL

然后看下fopen()函数;

1.fopen函数也是标准库中的函数,则有#include<stdio.h>

FILE * fopen(const char * path,const char * mode);

函数说明

参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。

/*
别忘了首先在指定的路径下新建一个名为 in 的文本文档;
/
#include
#include
#include
#include
using namespace std;
/

int main()
{
int a;
int count=0;
freopen(“F:\in.txt”, “r”, stdin);//其实in.txt是可以修改成其他名字的 比如“输入.txt”,都是可以的,这里只是为了方便起见,下同;
freopen(“F:\out.txt”, “w”, stdout);
while (cin >> a)
{
count++;
cout << "Case “<<count<<” : "<<a << endl;
}
fclose(stdin);//关闭文件
fclose(stdout);//关闭文件
return 0;
}
*/
int main()
{
int a,count=0;
FILE *fin, fout;
fin = fopen(“f:\in.txt”, “r”);
fout = fopen(“f:\out.txt”, “w”);
while (fscanf(fin, “%d”, &a) == 1)
{
count++;
//printf(“Case %d : %d\n”, count, a);
fprintf(fout, “Case %d : %d \n”, count, a);
}
fclose(fin);
fclose(fout);
return 0;
}
/

表 文件操作类型
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
字符 含义
────────────────────────────
“r” 打开文字文件只读
“w” 创建文字文件只写
“a” 增补, 如果文件不存在则创建一个
“r+” 打开一个文字文件读/写
“w+” 创建一个文字文件读/写
“a+” 打开或创建一个文件增补
“b” 二进制文件(可以和上面每一项合用)
“t” 文这文件(默认项)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 文件使用方式        意 义
“rt”      只读打开一个文本文件,只允许读数据
“wt”      只写打开或建立一个文本文件,只允许写数据
“at”      追加打开一个文本文件,并在文件末尾写数据
“rb”      只读打开一个二进制文件,只允许读数据
“wb”       只写打开或建立一个二进制文件,只允许写数据
“ab”       追加打开一个二进制文件,并在文件末尾写数据
“rt+”      读写打开一个文本文件,允许读和写
“wt+”      读写打开或建立一个文本文件,允许读写
“at+”      读写打开一个文本文件,允许读,或在文件末追加数 据
“rb+”      读写打开一个二进制文件,允许读和写
“wb+”      读写打开或建立一个二进制文件,允许读和写
“ab+”      读写打开一个二进制文件,允许读,或在文件末追加数据
对于文件使用方式有以下几点说明:

  1. 文件使用方式由r,w,a,t,b,+六个字符拼成,各字符的含义是:
    r(read): 读
    w(write): 写
    a(append): 追加
    t(text): 文本文件,可省略不写
    b(banary): 二进制文件
    +: 读和写
  2. 凡用“r”打开一个文件时,该文件必须已经存在, 且只能从该文件读出。
  3. 用“w”打开的文件只能向该文件写入。 若打开的文件不存在,则以指定的文件名建立该文件,若打开的文件已经存在,则将该文件删去,重建一个新文件。
  4. 若要向一个已存在的文件追加新的信息,只能用“a ”方式打开文件。
  5. 在打开一个文件时,如果出错,fopen将返回一个空指针值NULL。在程序中可以用这一信息来判别是否完成打开文件的工作,并作相应的处理。因此常用以下程序段打开文件:
    if((fp=fopen(“c:\hzk16”,“rb”)==NULL)
    {
    printf("\nerror on open c:\hzk16 file!");
    getch();
    exit(1);
    }
      这段程序的意义是,如果返回的指针为空,表示不能打开C盘根目录下的hzk16文件,则给出提示信息“error on open c:\ hzk16file!”,下一行getch()的功能是从键盘输入一个字符,但不在屏幕上显示。在这里,该行的作用是等待, 只有当用户从键盘敲任一键时,程序才继续执行, 因此用户可利用这个等待时间阅读出错提示。敲键后执行exit(1)退出程序。
  6. 把一个文本文件读入内存时,要将ASCII码转换成二进制码, 而把文件以文本方式写入磁盘时,也要把二进制码转换成ASCII码,因此文本文件的读写要花费较多的转换时间。对二进制文件的读写不存在这种转换。
  7. 标准输入文件(键盘),标准输出文件(显示器 ),标准出错输出(出错信息)是由系统打开的,可直接使用。文件关闭函数fclose文件一旦使用完毕,应用关闭文件函数把文件关闭, 以避免文件的数据丢失等错误。
    如果要打开一个CCDOS子目录中, 文件名为CLIB的二进制文件, 可写成:
    fopen(“c:\ccdos\clib”, “rb”);
    如果成功的打开一个文件, fopen()函数返回文件指针, 否则返回空指针(NULL)。由此可判断文件打开是否成功。
  8. fclose()函数
    fclose()函数用来关闭一个由fopen()函数打开的文件 , 其调用格式为:
    nt fclose(FILE *stream);
    该函数返回一个整型数。当文件关闭成功时, 返回0, 否则返回一个非零值。可以根据函数的返回值判断文件是否关闭成功。
    例子:
    FILE *fpOut=fopen(“c:\a.txt”,”wt+”);
    Int a=1;
    Fprintf(fpOut,”%d”,a);
    Fclose(fpOut);

重定向版
读入 freopen(“input.txt”,“r”,stdin);
“r”:只读,与stdin连用
输出 freopen(“output.txt”,“w”,stdout);
“w”:写,与stdout连用
函数原型:FILE *freopen(char *filename, char *type, FILE stream)
file写文件名即可,不要使用绝对路径或相对路径,应与工程放在同一文件夹中。
使用示例:
#include<stdio.h>
int main()
{
freopen(“input.txt”,“r”,stdin);
freopen(“output.txt”,“w”,stdout);
int i,n,count = 0;
long long a;
scanf("%d",&n);
a = n;
while(a>1)
{
if(a%2) a = 3
a+1;
else a = a/2;
count++;
}
printf("%d\n",count);
return 0;
}

fopen版
定义 FILE *fin,*fout;
fin = fopen(“data.in”,“rb”);
fout = fopen(“data.out”,“wb”);
输入用fscanf(fin,"%d",&n);
输出用fprintf(fout,"%d\n",count);
计算完成
fclose(fin);
fclose(fout);
使用示例:
#include<stdio.h>
int main()
{
FILE *fin,fout;
fin = fopen(“data.in”,“rb”);
fout = fopen(“data.out”,“wb”);
int i,n,count = 0;
long long a;
fscanf(fin,"%d",&n);
a = n;
while(a>1)
{
if(a%2) a = 3
a+1;
else a = a/2;
count++;
}
fprintf(fout,"%d\n",count);
fclose(fin);
fclose(fout);
return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`fopen` 和 `freopen` 都是 C 标准库的文件操作函数,它们的作用都是打开一个文件。但是它们的用法和行为有一些区别。 `fopen` 的用法是: ```c FILE *fopen(const char *filename, const char *mode); ``` `fopen` 打开一个文件,并返回一个指向文件的指针。 `filename` 是文件名,`mode` 是打开文件的模式字符串,包括: - "r":以只读方式打开文件,文件必须存在。 - "w":以写方式打开文件,文件不存在时创建,文件存在时清空内容。 - "a":以写方式打开文件,文件不存在时创建,文件存在时添加内容到文件末尾。 - "r+":以读写方式打开文件,文件必须存在。 - "w+":以读写方式打开文件,文件不存在时创建,文件存在时清空内容。 - "a+":以读写方式打开文件,文件不存在时创建,文件存在时添加内容到文件末尾。 `freopen` 的用法是: ```c FILE *freopen(const char *filename, const char *mode, FILE *stream); ``` `freopen` 重新打开一个已经打开的文件,返回一个指向该文件的指针。 `filename` 和 `mode` 的含义与 `fopen` 相同,`stream` 是一个已经打开的文件的指针。 `freopen` 会关闭 `stream` 所指向的文件,并使用 `filename` 和 `mode` 打开一个新的文件,返回一个指向该文件的指针。 因此,`fopen` 和 `freopen` 的主要区别在于: - `fopen` 打开一个新文件并返回一个文件指针,而 `freopen` 重新打开一个已经打开的文件并返回一个文件指针。 - `freopen` 会关闭 `stream` 所指向的文件,而 `fopen` 不会。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值