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

时间:2012-02-09 18:09:40

标签: c++ visual-c++

跟进我之前的问题(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文件的全部内容?

感谢。

3 个答案:

答案 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 ++太多了)只是为了完整性。