曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3106|回复: 1
打印 上一主题 下一主题

文件I/O

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2011-11-28 01:22:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
打开与关闭一个文件
C++ 中有 3 种类型的流:输入流,输出流,以及 输入输出流。我们可以通过将文件关联到一个流上来打开一个文件。

要打开一个输入流,必须将流声明为 ifstream 类型对象。
要打开一个输出流,必须将流声明为 ofstream 类型对象。
要打开一个输入输出流,必须将流声明为 fstream 类型对象。

如果已经创建了一个流,那么可以使用 open() 函数将流关联到文件上。这个函数分别是上面 3 种流类型的成员函数,原型分别如下:
[C++] 纯文本查看 复制代码
void ifstream::open(const char *filename, ios::openmode mode = ios::in);
void ofstream::open(const char *filename, ios::openmode mode = ios::out | ios::trunc);
void fstream::open(const char *filename, ios::openmode mode = ios::in | ios::out);

其中,filename 是文件的名字;mode 指定了文件的打开方式,他是一个类 ios 中定义的枚举值,如下所示:
ios::app      //添加到文件末尾
ios::ate       //打开文件时,文件的当前位置被定位到文件末尾
ios::binary   //以二进制模式打开文件
ios::in      //流可以从文件中输入
ios::out    //流可以输出到文件中
ios::trunc    //原文件中的内容被清除,文件长度被设为 0
可以用逻辑运算符 OR 将多个值组合一起。

以普通方式打开一个输出文件:
ofstream out;
out.open("test.txt");
由于 open() 中的 mode 在相应的默认参数,所以上面在打开文件时也不需要显式地指定出来。

实际上,类 fstream, ifstream 和 ofstream 中都定义了可以自动打开文件的构造函数,且这些构造函数的参数与默认的 open() 所带的参数一样,那么可以将打开文件写成:
[C++] 纯文本查看 复制代码
ifstream mystream("myfile");    //打开文件进行输入
ofstream mystream("myfile");   //打开文件进行输出


在操作完毕后,可以用 close() 函数来关闭一个文件,比如 mystream.close(); ,这里 close() 不需要带有参数,因为 mystream 本身就是一个关联到文件的流。

另外,还有一个 is_open() 函数用来判断是否成功打开一个文件,这个函数分别是类 fstream, ifstream 和 ofstream 的成员函数。

下面文件演示写入一个文件:
[C++] 纯文本查看 复制代码
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
        ofstream out("test.txt");
        if (!out) {
                cout << "Cannot open file.\n";
                return 1;
        }
        out << 10 << " " << 123.23 << "\n";
        out << "This is a short text file.";

        out.close();

        return 0;
}

运行输出:
./writefile
cat test.txt
10 123.23
This is a short text file.
下面程序演示从上面所创建的 test.txt 中读入一个整数,一个浮点数,一个字符以及一个字符串:
[C++] 纯文本查看 复制代码
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
        char ch;
        int i;
        float f;
        char str[80];

        ifstream in("test.txt");
        if(!in) {
                cout << "Cannot open file.\n";
                return 1;
        }

        in >> i;
        in >> f;
        in >> ch;
        in >> str;

        cout << i << " " << f << " " << ch << endl;
        cout << str;

        in.close();

        return 0;
}

运行输出:
./readfile
10 123.23 T
his
注意,在读入文本文件时,将会发生字符转换。例如,空白字符将被忽略。如果在想读入文件不发生字符转换,那么就必须以二进制模式打开文件。还需要注意,在使用 >> 读入字符串时,在遇到第一个空白字符后输入将会停止。

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
沙发
 楼主| 发表于 2011-11-28 11:21:09 | 只看该作者

无格式二进制I/O

在操作文件时,默认情况下都是以文本模式打开的。在文本模式下,会发生许多字符转换,比如 Windows 里的“回车” 、 “换行”会被转换为“换行字符”(\\r\\n) 。然而,当以文件以二进制模式打开时,就不会发生任何字符转换了,每个字节都保持原来的面目。

因此,对于所有的文件,无论文件包含的是格式化文本或者纯粹的数据,都可以用文本模式或者二进制模式打开,两者的区别仅在于是否进行数据转换

在对一个文件进行无格式的二进制操作时,要确保使用 ios::binary 模式打开文件。

有两种方法可以从文件中读取或者写入无格式的二进制数据:

1. 使用 get() 从文件中读取一个字符,用 put() 向文件中写入一个字符。
这两个函数有多种形式,下面两种是常见的:
istream &get(char &ch);
ostream &put(char ch);
get() 从流关联的文件中读出一个字符,并将字符放入变量 ch 中,同时返回流对象的引用,如果到达文件末尾,那么 ch 中的值就为空。
put() 将 ch 写入到流中并返回流对象的引用。

下面程序可以将任何文件的内容输出到屏幕上(使用 get() 函数):
[C++] 纯文本查看 复制代码
#include <iostream>
#include <fstream>
using namespace std;

int main(int argc, char *argv[])
{
        char ch;
        if (argc != 2) {
                cout << "Usage: PR <filename>\\n";
                return 1;
        }
        ifstream in(argv[1], ios::in | ios::binary);
        if (!in) {
                cout << "Cannot open file.\\n";
                return 1;
        }
        while(in) {
                in.get(ch);
                if(in) cout << ch;
        }
        in.close();

        return 0;
}

运行输出:
./getstream test.txt
hello world
如果执行到了文件末尾,那么流对象 in 的值将为假,那么 while 循环也随之结束。实际上,可以使用:
[C++] 纯文本查看 复制代码
while(in.get(ch))
     cout << ch;

这样使得代码更紧凑。

下面程序使用 put() 将字符串输入到文件中:
[C++] 纯文本查看 复制代码
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
        const char *p = "hello world";

        ofstream out("test.txt", ios::out | ios::binary);
        if (!out) {
                cout << "Cannot open file.\\n";
                return 1;
        }
        while(*p) out.put(*p++);

        out.close();

        return 0;
}

运行输出:
./putstream
cat test.txt
hello world
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-17 23:18 , Processed in 0.064984 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表