曲径通幽论坛

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

gcount() -- 获取最近一次输入操作所提取的字符个数

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2011-11-30 11:26:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
gcount() 函数用来获取最近一次未格式化输入操作所提取的字符个数。这些未格式化输入操作实际上是下面几个函数的执行行为:
get(), getline(), ignore(), peek(), read(), readsome(), putback() 以及 unget().

下面程序是一个文本比较程序,它用来比较两个文本是否完全一样。在程序中使用了 read(), eof() 和 gcount() 这几个函数。程序为了防止发生字符转换,会以二进制模式打开文件。然后每次将文件中的一部分内容读入到缓冲区中,并先比较读取到的字符数是否相同,如果不同则马上得知两个文本不一样;如果相同,那么依次比比较缓冲区中的每一个字符。

函数 gcount() 的作用就是获取一次 I/O 操作所读入到缓冲区中的字符数的数量。代码如下:
[C++] 纯文本查看 复制代码
#include <iostream>
#include <fstream>
using namespace std;

int main(int argc, char *argv[])
{
        register int i;

        unsigned char buf1[1024], buf2[1024];

        if(argc != 3) {
                cout << "Usage comfiles <file1> <file2>\n";
                return 1;
        }

        ifstream f1(argv[1], ios::in | ios::binary);
        if(!f1) {
                cout << "Cannot open first file.\n";
                return 1;
        }

        ifstream f2(argv[2], ios::in | ios::binary);
        if (!f2) {
                cout << "Cannot open second file.\n";
                return 1;
        }

        cout << "Comparing files..\n";

        do {
                f1.read((char *)buf1, sizeof buf1);
                f2.read((char *)buf2, sizeof buf2);
                if (f1.gcount() != f2.gcount()) {       //读取的字节数不一样
                        cout << "File are of differing sizes.\n";
                        f1.close();
                        f2.close();
                        return 0;
                }
                //比较缓冲区中的内容
                for (i = 0; i < f1.gcount(); i++)
                        if (buf1[i] != buf2[i]) {
                                cout << "File differ.\n";
                                f1.close();
                                f2.close();
                                return 0;
                        }
        }while (!f1.eof() && !f2.eof());

        cout << "Files are the same.\n";

        f1.close();
        f2.close();

        return 0;
}

运行输出:
./gcount reload_cin.cc reload_cin.cc.bak
Comparing files..
Files are the same.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-19 07:49 , Processed in 0.063838 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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