2013-02-15 158 views
0

请帮帮我。我无法读取二进制文件。该文件的长度是198944年,但我的代码读取374.我试图使用fread,ifstream,WinAPI ReadFile。 这是读取功能的文件:读取二进制文件C++

std::string ReadThisFile(std::string aPath) { 
    FILE *inputstream = fopen(aPath.c_str(),"rb"); 
    long size; 
    size_t result; 
    fseek(inputstream,0,SEEK_END); 
    size = ftell(inputstream); 
    rewind(inputstream); 
    char *buff = new char [size]; 
    result = fread (buff,1,size,inputstream); 
    std::string ret=buff; 
    fclose(inputstream); 
    delete[]buff; 
    return ret; 
} 

File sample

需要任何帮助,谢谢!

+0

是否使用'strlen'得到最终的大小?您不能在字符串中存储二进制内容。 – 2013-02-15 06:33:52

+1

该文件应该是一个ASCII文本文件,你想加载到一个单一的'std :: string'?如果不是,请使用不同的容器。 (如'std :: vector '或类似的东西)。 – WhozCraig 2013-02-15 06:42:14

+0

顺便说一下,'fseek(binary_stream,offset,SEEK_END)'不能保证工作(根据1999年的C标准)。 – 2013-02-15 07:15:17

回答

1

只要你意识到你返回std::string包含二进制数据,更换

std::string ret=buff; 

std::string ret(buff, size); 
+0

谢谢!它的工作! – Boleslav 2013-02-15 07:03:32

0

您不能将二进制数据放入字符串中。请记住,字符串由特殊字符'\0'终止,它与零值相同。如果二进制数据包含零,则与字符串的结尾相同。

您应该使用std::vector<int8_t>来存储二进制数据。

+0

谢谢。是的,那是我的问题。 – Boleslav 2013-02-15 06:55:38

0

问题是这里:

std::string ret = buff; 

根据this,它:

“复制空终止字符序列(C-字符串)指出由s”

因此,只要达到0x00字符就停止。

如果你要返回buff(这是一个危险的做法),或者让你的函数把一个char数组作为输入参数,并将它存储在那里,它应该可以工作。你可能想要返回一个长度指示符,否则C++将不知道数组有多大。

+0

谢谢。是的,那是我的问题。 – Boleslav 2013-02-15 06:55:01