跟进我之前的问题(Reading an entire file in binary mode using C++)
在二进制模式下读取jpg文件后,读取操作的结果总是4个字节。代码是:
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);
fseek(fd, 0, SEEK_SET);
int bytes_read = fread(stream, fileSize, 1, fd);
printf("%x\n", *stream);
fclose(fd);
第二个printf语句始终打印前4个字节而不是整个文件内容。如何打印jpg文件的全部内容?
感谢。
答案 0 :(得分:2)
你想用C ++吗?这将打开一个文件,将整个内容读入一个数组并将输出打印到屏幕上:
#include <fstream>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
ifstream in;
in.open("C:\\ISO\\ITCHOUT.txt", ios::in | ios::binary);
if(in.is_open())
{
// get the starting position
streampos start = in.tellg();
// go to the end
in.seekg(0, std::ios::end);
// get the ending position
streampos end = in.tellg();
// go back to the start
in.seekg(0, std::ios::beg);
// create a vector to hold the data that
// is resized to the total size of the file
std::vector<char> contents;
contents.resize(static_cast<size_t>(end - start));
// read it in
in.read(&contents[0], contents.size());
// print it out (for clarity)
for(const char& c : contents)
{
cout << c;
};
}
}
答案 1 :(得分:0)
stream
是指向int
的指针(您分配的数组的第一个元素 1 )。 *stream
取消引用该指针并为您提供第一个int
。
指针不是数组。指针不是缓冲区。因此,它不包含有关其指向的阵列大小的信息。通过仅提供指向第一个元素的指针,无法打印整个数组。
无论您使用哪种方法打印出来,都需要提供尺寸信息和指针。
C ++恰好在其标准库中有一个指针+大小的包:std::vector
。我建议使用它。或者,您可以自己遍历数组(这意味着使用大小信息)并打印其所有元素。
1 确保文件大小是sizeof(int)
的倍数!
答案 2 :(得分:0)
像下面这样的东西应该这样做。 bytes_read()为您提供读取的块数,在您的情况下,块大小是文件大小,因此只能读取一个块。
您应该使用for循环来打印整个文件。你只打印一个指针地址。
char *stream = (char *)malloc(fileSize);
fseek(fd, 0, SEEK_SET);
int bytes_read = fread(stream, fileSize, 1, fd);
for(int i=0; i<fileSize; i++){
printf("%d ", stream[i]);
}
我将字符打印为数字,因为二进制数据在控制台中无法读取。我不知道您希望如何格式化数据。
这仅仅是您的样本的参考。你应该考虑使用Chad的样本。这是一个更糟糕的解决方案(因为混合C / C ++太多了)只是为了完整性。