0%

C++中文件的输入和输出

C++中文件的输入和输出机制和屏幕上输入输出相似, 主要区别在于需要显式地打开和关闭文件. 对文件进行操作时会涉及到5个相关的类:

  • fstreambase: 公共基类, 具体文件操作中不会使用这个类.
  • ifstream: 从istream派生, 负责文件的读取.
  • ofstream: 从ostream派生, 负责文件的写入.
  • fstream: 从fstreambase和iostream中派生, 负责对文件进行写入和读取.
  • filebuf: 从streambuf中派生, 用来提供缓冲支持.

下面的代码从一个txt读取字符(数字和字母):

#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, const char * argv[]) {

    ifstream inf;
    //打开文件
    inf.open("/Users/zhang/Desktop/C++/fileIO/1.txt");
    if (!inf) {
        cerr << "打开文件失败!" << endl;
        return -1;
    }

    char x;
    while (inf >> x) {
        cout << x;
    }
    cout << endl;
    //关闭文件
    inf.close();
    
    return 0;
}

下面的代码向文件中写入1~10共10个数字:

#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, const char * argv[]) {
    ofstream onf;
    onf.open("/Users/zhang/Desktop/C++/fileIO/2.txt");
    
    if (!onf) {
        cerr << "打开文件失败!" << endl;
        return -1;
    }
    
    for (int i = 0; i <= 10; i++) {
        onf << i << endl;
    }
    
    onf.close();
    
    return 0;
}	

上面两个例子中的ifstream和ofstream都使用了open函数来打开文件, 其实通过ifstream和ofstream的构造函数可以实现相同的功能:

ifstream inf("/Users/zhang/Desktop/C++/fileIO/1.txt");
或
ofstream onf("/Users/zhang/Desktop/C++/fileIO/2.txt");

此外, 还有另外一个构造函数, 可以指定文件打开的模式:

  • ios::in : 打开一个可读取文件.
  • ios::out : 打开一个可写入文件.
  • ios::app : 在文件末尾追加数据.
  • ios::trunk : 删除文件原来的内容.
  • ios::nocreate : 如果要打开文件不存在, 不会创建同名文件.
  • ios::noreplace : 如果要打开的文件已存在, 不会对已存在的文件进行替换.
  • ios::binary : 以二进制形式打开文件.

通过’|’操作符可以指定多个打开模式. 下面是一个使用组合模式的例子:

#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, const char * argv[]) {

    fstream File("/Users/zhang/Desktop/C++/fileIO/1.txt",ios::in | ios::app);
    if (! File) {
        cerr << "打开文件失败!" << endl;
        return -1;
    }
    
    //写入文件
    File << "hello world";
    //将文件指针移动至文件开头
    File.seekg(ios::beg);
    //输入文件内容
    char str[100];
    File.getline(str, 100);
    cout << str << endl;
    
    File.close();
    
    return 0;
}