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++的文件重定向
再见!