14 文件重定向与文件读写操作
发布时间:
一、总概
// 1)"D:\data\txt\test.txt" //错误
// 2)R("D:\data\txt\test.txt)" //原始字面量 C++11标准
// 3)"D:\data\txt\test.txt" //转义字符
// 4)"D:/data/txt/test.txt" //转义字符
// 5)"D:/data/txt/test.txt" //Linux系统采用方法
几种操作比较
说明 | fopen | freopen | fstream |
---|---|---|---|
加载包 | <iostream> | <cstdio> | < fstream> |
打开写文件指针 | fopen("*.txt", "wb") | freopen("in.txt", "w", stdout) | ofstream out;fout.open("test.txt"); |
打开读文件指针 | fopen("*.txt", "rb") | freopen("in.txt", "r", stdin) | ifstream fin; fin.open("fstream_in.txt"); |
读文件 | fscanf(fin, "%d", &temp) | 直接复用标准输入 cin, scanf | fin >> a; |
写文件 | fprintf(fout, "%d\n", sum) | 直接复用标准输出cout, printf | fout << "4333333\n" |
关闭指针 | fclose(fin); | fclose(stdin) | fout.close() |
二、fopen
基础应用样例1:
js
#include <iostream> //fopen必须引用 iostream包
using namespace std;
int main() {
FILE *fin, *fout;
fin = fopen("fopen_in.txt", "rb");
fout = fopen("fopen_out.txt", "wb");
int temp;
fscanf(fin, "%d", &temp); // 从输入文件中读入数据
fprintf(fout, "%d\n", temp);// 数据输出到文件
// cin >> temp; // 从键盘读取
// cout << temp << endl; // 输出到终端
fclose(fin);
fclose(fout);
return 0;
}
提高样例2:
js
#include <iostream>
using namespace std;
int main() {
FILE *fin, *fout;
fin = fopen("in.txt", "rb"); // 定义输入文件名
fout = fopen("out.txt", "wb"); // 定义输出文件名
int temp, sum = 0;
while (fscanf(fin, "%d", &temp) == 1) // 从输入文件中读入数据
{
sum = sum + temp;
}
fprintf(fout, "%d\n", sum); // cout<<sum<<endl;
fclose(fin);
fclose(fout); // 关闭文件,可省略
return 0;
}
三、freopen
命令格式: FILE * freopen ( const char * filename, const char * mode, FILE * stream );
- 引用 #include <cstdio>
- filename: 要打开的文件名
- mode: 文件打开的模式(r/w)
- stream: 文件指针,通常使用标准流文件(stdin/stdout/stderr)stdin是标准输入流,默认为键盘;stdout是标准输出流,默认为屏幕;stderr是标准错误流,一般把屏幕设为默认
基础用例1
js
#include <cstdio> //使用freopen语句,须调用cstdio库
// #include <iostream>//cin cout 须调用 iostream库
using namespace std;
int main() {
freopen("cstdio_in.txt", "r", stdin); // 定义输入文件名
freopen("cstdio_out.txt", "w", stdout); // 定义输出文件名
int temp ;
scanf("%d", &temp); //转为读取文件
printf("%d\n", temp);//转为输出到文件
// cin>>temp;
// cout<<temp<<endl;
fclose(stdin);
fclose(stdout); // 关闭文件,可省略
return 0;
}
in.txt
js
1
2
3
out.txt
js
1
2
3
提高用例2:
js
#include <cstdio>
int main() {
freopen("in.txt", "r", stdin); // 定义输入文件名
freopen("out.txt", "w", stdout); // 定义输出文件名
int temp, sum = 0;
//(cin>>temp)从输入文件中读入数据,在C++中非0为真
while (scanf("%d", &temp) == 1){
sum = sum + temp;
}
printf("%d\n", sum); // cout<<sum<<endl;
fclose(stdin);
fclose(stdout); // 关闭文件,可省略
return 0;
}
in.txt文件内容
js
1 2 3 4 5
运行结果 out.txt文件内容为
js
15
四、文件流操作 fstream
基础用例1:
js
#include <fstream> // ofstream ifstream 类需要包含的头文件。
using namespace std;
int main() {
ofstream fout;
ifstream fin;
fout.open("fstream_out.txt");
fin.open("fstream_in.txt");
int a;
fin >> a;
fout << a;
fout.close();
fin.close();
return 0;
}
进阶用例2:
js
#include <fstream> // ifstream 类需要包含的头文件。
#include <iostream>
#include <string> //getline() 函数需要包含的头文件。
using namespace std;
int main() {
ifstream fin;
fin.open("fstream_in.txt");
ofstream fout;
fout.open("fstream_out.txt");
if (fin.is_open() == false) { // 失败原因 1 目录不存在,2 磁盘空间已满,3 没权限,Linux平台常见。
cout << " 打开文件失败" << endl;
}
// 第一种方法
string buffer;
while (getline(fin, buffer)) {
cout << buffer << endl;
}
// 第二种方法
char buffers[101]; // 存放从文件中读取的内容
// 注意:如果采用ifstream.getline(),一定要保证缓冲区足够大。
// getline 为fin 的getling 不是string包中的getline()
while (fin.getline(buffers, 100)) {
cout << buffers << endl;
}
// 第三种方法 第一种的简写
string buffer3;
while(fin>>buffer3){
cout<<buffer3<<endl;
}
fin.close();
cout << "文件操作完成" << endl;
return 0;
}