freopen函数的具体使用和例题购物单(蓝桥杯2017年试题A)

购物单原题     

小明刚刚找到工作,老板人很好,只是老板夫人很爱购物。老板忙的时候经常让小明帮忙到商场代为购物。小明很厌烦,但又不好推辞。这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的。小明也有个怪癖,不到万不得已,从不刷卡,直接现金搞定。现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物。取款机只能提供100元面额的纸币。小明想尽可能少取些现金,够用就行了。你的任务是计算出,小明最少需要取多少现金。以下是让人头疼的购物单,为了保护隐私,物品名称被隐藏了。
    
****     180.90       88折

****      10.25       65折

****      56.14        9折

****     104.65        9折

****     100.30       88折

****     297.15       半价

****      26.75       65折.............


本题中各个折扣和标价太多都需要进行输入处理,键盘输入太麻烦,可以将这几个数据自己手动写入到一个文件中,从文件中读取到代码里。


freopen函数介绍

在程序处理过程中我们会经常遇到需要读取大量数据的情况,在此时若用scanf进行键盘一个个输入,输入时间会过长,此时我们可以调用freopen()函数,即文件重定向技术,进行文件调用。

freopen函数声明:FILE*freopen(const char* filename,const char *mode,FILE*stream);

第一个参数const char* filename是文件路径,第二个参数是代表文件访问权限的字符串,常用的有“r”表示只读访问(读取文件数据时用),“w”表示只写访问(往文件里面写入数据时使用),第三个参数是需要被重新定义的文件流(stdin,stdout)。

注意文件流在调用时,需要在函数结束时进行fclose,将文件流调用关闭。


freopen函数具体的操作方法

首先鼠标右键点击新建进行文本文档的新建

 然后打开文本文档,将数据进行输入,注意输入时要把数据进行处理,因为题目给的原始数据中既有数字也有中文,譬如中文半折要改成50,把中文折删去即可。数据在手动写入时也有技巧,因为在后面编程时考虑到要把价格放到一个数组里面,把折扣放在一个数组里,因此输入结果如下

 进行输入过之后,就可以进行代码编程啦,但是首先是要找到创建文件的直接地址,我们可以右键点击文本文档,点击属性

 文中红圈标记就是直接地址,后缀再加上文件名字即可,注意在编程时直接地址要加双杠,即是C:\\Users\\Lenovo\\Desktop\\新建文本文档.txt,下面开始编程


#include<stdio.h>
int main()
{
	freopen("C:\\Users\\Lenovo\\Desktop\\新建文本文档.txt", "r", stdin);
	int i=0,c=0;
	float sum=0,price[100],discount[100];
	while (scanf("%f %f", &price[i], &discount[i])!=EOF)//将文件中数据读取到两个数组里面
		i++;
	while (i--)
	{
	 if (discount[c] < 10)
	 sum = sum+price[c] * discount[c] / 10;
	 else
	  sum = sum+price[c] * discount[c] / 100;
	 c++;
	 }
	printf("%f", sum);
 

}

部分结果演示(头七件商品):

 

`freopen` 是一个在 C 和 C++ 中常用的库函数,它用于重新指定输入/输出文件流。它接受两个参数:一个已经存在的文件名和一个新的文件名,这样你可以在不同的文件中读写数据。函数原型如下: ```c FILE * freopen(const char *filename, const char *mode, FILE *stream); ``` 其中: * `filename` 是你想打开的新文件名。 * `mode` 是打开文件的模式。它与标准输入/输出流中的模式类似,例如 "r" (读取), "w" (写入), "a" (追加) 等。 * `stream` 是你想更改的旧文件流。这通常是一个 `FILE*` 类型的指针,通常是从 `fopen` 返回的。 使用 `freopen` 函数时,要注意以下几点: 1. 文件名必须是存在的文件或目录。如果指定的文件不存在,程序会报告一个错误并退出。 2. 如果指定的文件名是一个目录,那么文件会被视为一个文件列表,所有在列表中的文件都会被打开,但只能有一个文件被使用。如果试图同时使用多个文件,程序会报告一个错误并退出。 3. `freopen` 函数返回一个指向先前打开的文件流的指针,如果操作成功的话。如果操作失败,它将返回 `NULL`。 下面是一个简单的例子,展示了如何使用 `freopen` 函数: ```c #include <stdio.h> int main() { FILE *fp; // 打开一个文件用于写入 fp = freopen("test.txt", "w", stdout); if (fp == NULL) { printf("Error opening file!\n"); return 1; } // 在文件中写入一些文本 fprintf(fp, "Hello, world!\n"); // 关闭文件流 fclose(fp); // 重新打开同一个文件用于读取 fp = freopen("test.txt", "r", stdin); if (fp == NULL) { printf("Error opening file!\n"); return 1; } // 在输入流中读取文本并打印出来 char c; while ((c = getc(fp)) != EOF) { putchar(c); } // 关闭文件流 fclose(fp); return 0; } ``` 在这个例子中,我们首先使用 `freopen` 函数将标准输出重定向到一个名为 "test.txt" 的文件,用于写入。然后我们在这个文件中写入一些文本。接着,我们再次使用 `freopen` 函数将这个文件重新打开为标准输入,用于读取。最后,我们读取并打印出文件中的内容。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值