C++中fstream的read问题

 int main(){
    fstream file1;
    char buffer[512];
    char c;
    file1.open("66666.txt", ios::in);
    file1.seekg(0, ios::end);
    string::size_type file_size = file1.tellg();
    cout<<file_size<<endl;
    file1.seekg(0, ios::beg);
    for(;;){
        file1.read(buffer, 512);
        cout<<file1.gcount()<<endl;
        cout<<file1.tellg()<<endl;
        if(file1.eof()){
            break;
        }

    }
    file1.close();
    cin>>c;
    return 0;
}

图片说明

以上是我的代码和结果,我这个程序的目的是每次读取文件中的512个字节,输出是首先输出这个文件的总字节数,然后每次读的时候输出所读入的字节数以及当前get 流指针的位置。
我第一次读512字节之后,当前get流指针的位置不应该是512吗,为什么这个程序却跑出了533的结果?
我同学在他的苹果机上跑却是正确的结果。
我的环境是vs2008,32位win7系统,想知道为什么会有这样的现象出现。

读的是文本文件,在windows系统,回车换行即\r\n,二进制0D0A存储于文件中,读到数组时只有0D即\n,所以会有误差。

Windows系统里面,每行结尾是“<回车><换行>”,即“\r\n”;读进数组只有\n 即0A,所以有一个字节误差。
Mac系统里,每行结尾是“<回车>” ,即“\r”;

ios::binary表示在创建文件流时,可以指定打开方式为二进制方式打开,虽然无论是否指定二进制方式打开文件,读写的最小单位都是字节,但是二进制跟普通的文本格式最大差别在于对换行符的处理方式不同。

由于历史原因,Windows操作系统是用两个字符(\r\n)来表示换行符的;而Unix操作系统却是用单个字符(\n)来表示换行符的。因此,在创建文件流时,如果指定了以ios::binary方式打开,那么换行符就是单字符的;否则,就采用Windows操作系统的双字符。