Skip to content
本页目录

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系统采用方法

几种操作比较

说明fopenfreopenfstream
加载包<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, scanffin >> a;
写文件fprintf(fout, "%d\n", sum)直接复用标准输出cout, printffout << "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;
}