使用C ++以二进制模式读取整个文件

时间:2012-02-09 17:48:49

标签: c++ visual-c++

我正在尝试使用visual c ++以二进制模式读取整个jpg文件。代码如下:

FILE *fd = fopen("c:\\Temp\\img.jpg", "rb");
if(fd == NULL) {
    cerr << "Error opening file\n";
    return;
}

fseek(fd, 0, SEEK_END);
long fileSize = ftell(fd);
int *stream = (int *)malloc(fileSize);
cout << fileSize << '\n';
fseek(fd, 0, SEEK_SET);
int bytes_read = fread(stream, fileSize, 1, fd);
printf("%i\n", bytes_read);
fclose(fd);

问题是bytes_read始终为1. fileSize变量包含正确的文件大小。所以我不确定为什么bytes_read总是1并且不等于fileSize ..?

6 个答案:

答案 0 :(得分:2)

int n_read = fread(stream, fileSize, 1, fd);

返回你得到的大小为fileSize的块数。在这种情况下1。

请参阅C标准的第7.21.8.1节: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1548.pdf(第334页)

因此,您需要将n_read乘以fileSize以获取读取的字节数。

答案 1 :(得分:2)

如果你想要读取的字节数,你需要像这样切换参数:

int bytes_read = fread(stream, 1, fileSize, fd);

答案 2 :(得分:1)

RETURN VALUE
       fread() and fwrite() return the number of items  successfully  read  or
       written  (i.e.,  not the number of characters).  If an error occurs, or
       the end-of-file is reached, the return value is a short item count  (or
       zero).

你告诉它要阅读1件大小fileSize,确实如此。

答案 3 :(得分:1)

来自man 3p fread

  

fread()和fwrite()返回成功读取或写入的项目数(即不是字符数)。如果发生错误或达到文件结尾,则返回值为短项          数(或零)。

你告诉它读取1个文件长度,这就是它所读取的内容。

答案 4 :(得分:0)

在C ++中,您可以使用带有惯用阅读风格的std::ifstream

std::ifstream file("file.bin", std::ifstream::binary); //binary mode!
std::istream_iterator<char> begin(file), end);  //setup iterators!
std::vector<char> v(begin,end);  //read all data into a vector!
//v contains the binary data, which you can use from now on

//you can get the pointer to the data as
char *buffer = &v[0];
size_t sizeOfBuffer = v.size();
//you can use buffer and sizeOfBuffer instead of v.

//just remember that the lifetime of buffer is tied with the lifetime of v
//which means, if v goes out scope, the pointer `buffer` will become invalid

希望您阅读上述代码段中的评论。 : - )

答案 5 :(得分:0)

在你对fread的调用中,你告诉它要读1字节......

应该是:fread(stream,1,filesize,fd);