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. |