[C++] large files

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Topicstarter
Kan iemand dit verklaren?

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <fstream>


int main() {
    std::cout << "size_t          " << sizeof(size_t)*8 << " bits" << std::endl;
    std::cout << "long long       " << sizeof(long long)*8 << " bits" << std::endl;
    std::cout << "int:            " << sizeof(int)*8 << " bits" << std::endl;
    std::cout << "void*:          " << sizeof(void*)*8 << " bits" << std::endl;
    std::cout << "std::streamoff: " << sizeof(std::streamoff)*8 << " bits" << std::endl;
    std::cout << "std::fpos_t:    " << sizeof(std::fpos_t)*8 << " bits" << std::endl;

    std::ifstream ifs("C:\\Users\\Ferdi\\Desktop\\3Dheart_021_20100107\\section021.RAW", std::ios::in | std::ios::binary);
    if (ifs.is_open()) {
        ifs.seekg(0, std::ios::end);
        
        long long end1 = ifs.tellg(); // fails
        long long end2 = ifs.tellg().seekpos(); // works
        
        std::cout << "Should be  : 4255514008 bytes" << std::endl;
        std::cout << "File size 1: " << end1 << " bytes" << std::endl;
        std::cout << "File size 2: " << end2 << " bytes" << std::endl;
    }
    return 0;
}

Out:

size_t          64 bits
long long       64 bits
int:            32 bits
void*:          64 bits
std::streamoff: 64 bits
std::fpos_t:    64 bits
Should be  : 4255514008 bytes
File size 1: -39453288 bytes
File size 2: 4255514008 bytes

(VC9 x64)

seekpos() is zeker geen standaard C++ heh?

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

En wat is de grootte van std::ios::pos_type?

.edit: ik snap het niet. fstream::pos_type is een fpos<int>. Die heeft op zijn beurt weer een conversion operator naar streamoff, en die is 64 bits. Het is dus niet logisch dat je er een 32 bits uit krijgt :?

.edit: oh, het komt door de implementatie:
C++:
1
2
3
4
5
6
7
8
    __CLR_OR_THIS_CALL operator streamoff() const
        {   // return offset
        return ((streamoff)(_Myoff + _FPOSOFF(_Fpos)));
        }

// en

#define _FPOSOFF(fp) ((long)(fp))

Hij convert de position dus doodleuk naar long :/

[ Voor 220% gewijzigd door .oisyn op 09-04-2010 12:47 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Topicstarter
Ah, daar zit het... ik zag het door de typedefs het type even niet meer.

stdio.h maakt het duidelijker:

C++:
1
2
3
4
5
6
7
8
9
#if     !__STDC__
/* At this point we could switch both to long long, but we won't do that till next version to avoid any potential compat issues */
typedef __int64 fpos_t;
#define _FPOSOFF(fp) ((long)(fp))
#else
typedef long long fpos_t;
#define _FPOSOFF(fp) ((long)(fp))
#endif
#endif  /* _POSIX_ */


Handig ja...

Gefeliciteerd trouwens :)


Hoe ziet dit eruit in VC10? Is het daar "gemaakt"?

[ Voor 7% gewijzigd door Zoijar op 09-04-2010 13:25 ]