C++文件重定向

1、freopen

我们首先来讲最基础的想文件中写入数据

格式:

freopen("文件名", "访问方式", stdout);

这就是向文件中写入数据的格式

我们想要想output.txt这个文件中写入"Hello World",我们可以这样:

freopen("output.txt", "w", stdout);
cout << "Hello World";

往文件中写入数据的格式是“w”,是单词write的缩写

但是这样写会报错:

我们来举个例子:

我们向文件中去写入数据就好比往一个杯子里装水,我们把水装完就不能不管了,我们是不是还需要把盖子盖上?我们就是没有把“盖子”盖上才会报错,所以我们要干什么?闭流呀!

格式:

fclose(stdout);

这就是闭流的办法,我们在来运行一下:

我们可以发现还是会报错,但是我们使用VS可以看到报错的类型:

我们可以看到是报了一个C4996的错误,这是VS的自我保护机制,我们可以把这个类型的错误给禁止了:

#pragma warning(disable:4996)

我们可以写一个这样的代码,然后再disable后面写上错误码即可,我们再来运行一下:

我们可以看到程序正常运行,我们再来看一下文件夹:

发现创建了一个output.txt的文本文件,我们在打开来看一下:

我们可以发现"Hello World"已经被成功的写入文件了

我们只要是在创建流之后、闭流之前输出的内容,都会被写入到文件中去

然后我们要进行另一个操作——读取文件中的数据

格式:

freopen("文件名", "r", stdin);

我们可以发现,读取文件的格式是"r",是英文单词read的缩写

我们还是同样要闭流,但是我们必须在程序运行之前就在文件中写好数据

我们可以做一个简单的操作:

定义一个变量n,然后输入,最后输出,输入输出都要在文件中进行,代码:

#pragma warning(disable:4996) //禁止C4996类型的错误/异常
#include <bits/stdc++.h>
using namespace std;
int main(){
    freopen("input.txt", "r", stdin); //读取input.txt文件中的数据
    freopen("output.txt", "w", stdout); //向output.txt文件中写入数据
    //输入输出
    int n;
    cin >> n;
    cout << n;
    //闭流
    fclose(stdin);
    fclose(stdout);
    return 0;
}

我们之前还学习过进制转换,我们可以在文件中执行,代码:

#pragma warning(disable:4996)
#include <bits/stdc++.h>
using namespace std;
void two(int n) {
	int s[100] = { 0 };
	int c = 1;
	while (n > 0)
	{
		s[c] = n % 2;
		n /= 2;
		c++;
	}
	cout << "二进制:";
	if ((c - 1) % 4 != 0)
		c = (c - 1) / 4 + 1;
	else
		c = c / 4;
	for (int i = c * 4; i >= 1; i--)
	{
		cout << s[i];
		if (i % 4 == 1)
			cout << " ";
	}
	cout << endl;
}
void eight(int n) {
	int s[100] = { 0 };
	int c = 1;
	while (n > 0)
	{
		s[c] = n % 8;
		n /= 8;
		c++;
	}
	cout << "八进制:";
	if ((c - 1) % 3 != 0)
		c = (c - 1) / 3 + 1;
	else
		c = c / 3;
	int p = 0;
	for (int i = c * 3; i >= 1; i--)
	{
		if (s[i] != 0)
		{
			p = i;
			break;
		}
	}
	for (int i = p; i >= 1; i--)
	{
		cout << s[i];
		if (i % 3 == 1)
			cout << " ";
	}
	cout << endl;
}
void sixteen(int n) {
	char s[100] = { '0' };
	int c = 1;
	while (n > 0)
	{
		switch (n % 16)
		{
		case 10:
			s[c] = 'A';
			break;
		case 11:
			s[c] = 'B';
			break;
		case 12:
			s[c] = 'C';
			break;
		case 13:
			s[c] = 'D';
			break;
		case 14:
			s[c] = 'E';
			break;
		case 15:
			s[c] = 'F';
			break;
		default:
			s[c] = n % 16 + '0';
			break;
		}
		n /= 16;
		c++;
	}
	cout << "十六进制:";
	if ((c - 1) % 4 != 0)
		c = (c - 1) / 4 + 1;
	else
		c = c / 4;
	int p = 0;
	for (int i = c * 4; i >= 1; i--)
	{
		if (s[i] != 0)
		{
			p = i;
			break;
		}
	}
	for (int i = p; i >= 1; i--)
	{
		cout << s[i];
		if (i % 4 == 1)
			cout << " ";
	}
	cout << endl;
}
int main() {
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
	int n;
	cin >> n;
	two(n);
	eight(n);
	cout << "十进制:" << n << endl;
	sixteen(n);
	fclose(stdin);
	fclose(stdout);
	return 0;
}

我这里就不运行了

2、freopen_s

我们可以用更安全的freopen_s来进行文件重定向,格式有些许不同,其他都一样,格式:

#pragma warning(disable:4996)
#include <bits/stdc++.h>
using namespace std;
int main() {
	FILE* file;
	errno_t er = freopen_s(&file, "output.txt", "w", stdout);
	return 0;
}

我们可以看到,我们需要使用变量接收

3、ofstream

上面讲的freopen和freopen_s都是C语言的语法风格,我们还可以用C++的语法风格

首先就是向文件中写入数据

我们可以利用ofstream关键字声明一个对象,格式如下:

ofstream 对象名称("文件名");

我们声明一个outfile的对象,将数据写入output.txt这个文本文件,代码:

ofstream outfile("output.txt");

由于刚才我们写入的是"Hello World",这次我们为了区分,我们这次写入"Hello Stream":

ofstream outfile("output.txt");
cout << "Hello Stream";

运行结果:

我们可以发现最终还是输出在了控制台,我们不能直接cout,应该用对象名称,也就是outfile才行

格式:

对象名 << 数据1 << 数据2 << 数据3 << ... << 数据n;

所以我们应该这样写:

#include <bits/stdc++.h>
using namespace std;
int main(){
    ofstream outfile("output.txt");
    outfile << "Hello Stream";
    return 0;
}

运行结果:

没有输出在控制台,我们再来看一下文件:

我们可以发现"Hello Stream"已经出现在了文件output.txt里面

4、ifstream

我们再来学习一下读取文件

我们还是一样的格式:

ifstream infile("input.txt");
int n;
infile >> n;

我们这样就可以了,我们再把I/O流(叫做I/O流)结合起来,求1~n的和,代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
    ifstream infile("input.txt");
    ofstream outfile("output.txt");
    int n;
    infile >> n;
    int s = 0;
    for(int i = 1; i <= n; i++)
        s += i;
    outfile << s;
    return 0;
}

但是这样写是很不规范的,虽然不会报错,我们应该闭流,用对象名.close()来闭流,规范写法:

#include <bits/stdc++.h>
using namespace std;
int main(){
    //创建流
    ifstream infile("input.txt");
    ofstream outfile("output.txt");
    //定义并输入
    int n;
    infile >> n;
    //求和
    int s = 0;
    for(int i = 1; i <= n; i++) //循环n次
        s += i;
    outfile << s; //输出
    //闭流
    infile.close();
    outfile.close();
    return 0;
}

这就是C++的文件重定向

再见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值