2013-03-19 62 views
0

我尝试在包含charint & double头后的二进制文件阅读:错误读取二进制文件用C++

// open file 
int pos = 0,n; 
char str1,str2; 

//string str; 
ifstream fid(pfad.c_str(),std::ios::binary); 
if (fid.good() != 1) { 
    printf(" ++ Error: The elegant bunch file %s doesn't exist.\n",pfad.c_str()); 
    return 1; 
} 

// cut the header 
while (pos<5) { 
    if (fid.eof()) { 
     printf(" ++ Error: elegant bunch file is strange\n"); 
     return 1; 
    } 

    fid >> str1; 

    switch (pos) { 
     case 0: str2 = '&'; break; 
     case 1: str2 = 'd'; break; 
     case 2: str2 = 'a'; break; 
     case 3: str2 = 't'; break; 
     case 4: str2 = 'a'; break; 
    } 

    if (str1 == str2){ 
     pos ++; 
    } else { 
     pos = 0; 
    } 
} 

    // Read out the data 
    fid.seekg(19,ios_base::cur); 

std::cout << fid.tellg() << std::endl; 
fid >> n; 
std::cout << fid.tellg() << std::cout; 


printf("\n\n%i\n\n",n); 
printf("\nOK\n"); 
return 0; 

我与fid >> str1的作品就好了阅读字符。如果我试图用int这样做,它会产生某种奇怪的行为。输出然后得到

813 

-10x6c4f0484 

0 

从而使第一个数字是在文件中的位置,第二个应该是相同的,但它看起来像一个指向我。任何人都可能试图澄清我的困惑?

已经提前致谢。

+2

*“任何人都可以尝试澄清我的困惑吗?” - 你的问题本身是以非常混乱的方式写的。尝试编辑它,使其更清楚您的问题是什么请。 – LihO 2013-03-19 11:06:01

回答

1

std::operator>>(std::istream&, int&)试图从解析从字符流中取一个整数,它不读取二进制数据。您需要使用std::istream::read(char*, std::streamsize)函数。

+0

是的,这是它。虽然对我来说似乎相当扼杀,你必须这样做。但是,我的经历再一次使用高级语言。 Thx为您的答案 – 2013-03-19 13:01:01

+0

我认为现代C++是一种高级语言,如果需要,您可以使用低级语言;-)回到问题:这只是一个语义问题。 'operator >>'无法知道它是否应该尝试将一个字符串解析为一个整数或是否应该读取二进制数据。因此,您需要了解API及其语义。顺便说一句:同样在非常高级的Python语言中,你必须为二进制I/O调用'file.read(nbytes)'。 – 2013-03-19 13:08:33