【问题标题】:Why size of file .jpg is't same after read binary in C++?为什么在 C++ 中读取二进制文件后 .jpg 文件的大小不一样?
【发布时间】:2015-11-10 10:35:36
【问题描述】:

这是我的图片.jpg

现在我尝试读取文件,打开文件的代码:

ifstream inputFile("pic.jpg", ios::in | ios::binary);
ofstream outFile("pic2.jpg", ios::out | ios::binary);
ofstream outFileTXT("pic2.txt", ios::out | ios::binary);

然后我从 inpuFile 读取 256 个字节并写入 outFile 和 outFileTXT。

尺寸问题,我的意思是: pic.jpg = 11,126 字节。 pic2.jpg = pic2.txt = 4,966 字节。

这是我的读取缓冲区,

char buffer[257];

我的代码在 *.txt 上运行良好(没问题)。

对于 11,126 字节需要 43 次读取(256 字节)+ 还有什么 ..

跑 43 次 ..

while (i++ < mod) {
    // read from binary file 256 byte
    in.read(buffer, 256);
    // init packet and save it in list by string.
    handler << buffer; // this line save buffer in list<string>
}

然后我将我的列表打印到文件中。

这个想法是:保存缓冲区(大小 256 字节)除了最后一个(118 bytes) 到列表中,意味着列表的大小必须为 44、43 (256 字节) + 1 (118 字节)

然后将列表打印到文件中。

【问题讨论】:

  • 也许显示你的代码?
  • 告诉我们你的代码做了什么实际上并没有告诉我们它做了什么,它告诉我们你认为它做了什么。我们需要查看代码本身。
  • 我无法添加我的代码,因为这是家庭作业!寻找新的添加。

标签: c++ file binary


【解决方案1】:

这个有问题:

char buffer[257];

// ..

while (i++ < mod) {
    // read from binary file 256 byte
    in.read(buffer, 256);
    // init packet and save it in list by string.
    handler << buffer;
}

具体如下:

handler << buffer;

因为bufferchar*,它会将其视为以空结尾的字符串,并从缓冲区输出字符,直到找到。它不会像你期望的那样输出整个缓冲区。

您可以为此使用write()

while (i++ < mod) {
    // read from binary file 256 byte
    in.read(buffer, 256);
    // init packet and save it in list by string.
    handler.write(buffer, in.gcount()); // output all that was read
}

注意:函数 in.gcount() 告诉我们在之前的 in.read() 函数中读取了多少个字符(它并不总是正好是 256,如果我们到达末尾可能会更少)。

【讨论】:

  • 这个处理程序 数据中的保存缓冲区。所有的想法都是从文件中取出 256 个字节并将其保存在列表中! wick 意味着列表的大小必须是 44,因为我们还有 43*256 + 什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多