2012-06-22 89 views
4

我对C++比较陌生,并且在ifstream中有一些问题。我想要做的就是逐字节读取文件,但是在文件中间读取总是失败。我的代码:用ifstream读取字节

void read(ifstream&f) 
{ 
    unsigned char b; 
    for (int i=0;;++i) 
    { 
     if(!f.good()) 
     { 
      cout<<endl<<"error at: "<<i; 
      return; 
     } 
     f>>b; // b=f.get(); and f.read(&b, 1); doesnt work either 
     cout<<b; 
     /* ... */ 
    } 
} 

它正确读取前几百个字节,然后文件的其余部分被跳过。缓冲有问题吗?我做错了什么?

编辑:

我只是发现了一些可能的原因:在文件我用CRLF行结束(2个字节),但所有上述方法在每行的末尾只返回LF,所以我只增加一个,但文件中有2个字节。所以我的问题是:我怎样才能分别获得CR和LF?

+1

你是否收到“error at:”报告?你正在阅读一个二进制文件或文本文件?如果前者,你是否以二进制模式打开ifstream? –

+0

'cout << b'不能打印某些字符,如果它们不是可打印的字符。 – Nawaz

+0

该文件只包含可打印的字符。 – Dave

回答

1

我终于通过在二进制模式下打开文件得到它的工作(感谢亚历克斯吸引了我的注意力)。

似乎CR字符混淆了ifstream和cout,这引起了我的困惑,我会牢记这一点。

+3

为什么不接受Beta的答案?这不公平。 – qed

+1

@qed我想我已经在我的问题编辑和Beta的答案评论中都明确表示他的解决方案无效。下次请仔细阅读。 – Dave

9

尝试

f.read(&b, 1); 

两个<<get()旨在为文本,而不是二进制数据。

+0

我试过了,而且我遇到了完全相同的问题。 – Dave

+2

@Dave,你能给我们一个导致错误的最小文件吗?另外,请告诉我们你如何准备'ifstream'。 – Beta

+1

@Dave:你打开二进制模式的流吗? (如果你不是,你应该是) – ildjarn