簡體   English   中英

C ++ io的奇怪行為

[英]Strange behavior with c++ io

我正在使用zlib壓縮我正在制作的游戲的數據。 這是我一直在使用的代碼

#include <SFML/Graphics.hpp>
#include <Windows.h>
#include <fstream>
#include <iostream>
#include "zlib.h"
#include "zconf.h"

using namespace std;

void compress(Bytef* toWrite, int bufferSize, char* filename)
{
    uLongf comprLen = compressBound(bufferSize);
    Bytef* data = new Bytef[comprLen];
    compress(data, &comprLen, &toWrite[0], bufferSize);
    ofstream file(filename);
    file.write((char*) data, comprLen);
    file.close();
    cout<<comprLen;
}

int main()
{
    const int X_BLOCKS = 1700;
    const int Y_BLOCKS = 19;
    int bufferSize = X_BLOCKS * Y_BLOCKS;
    Bytef world[X_BLOCKS][Y_BLOCKS];
    //fill world with integer values
    compress(&world[0][0], bufferSize, "Level.lvl");
    while(2);
    return EXIT_SUCCESS;
}

現在,我希望程序可以簡單地壓縮數組世界並將其保存到文件中。 但是我注意到一個奇怪的行為。 當我使用'comprLen'值時,它的長度與創建的文件的長度不同。 我不明白文件中多余字節的來源。

您需要以二進制模式打開文件:

std::ofstream file(filename, std::ios_base::binary);

如果沒有std::ios_base::binary標志,系統將用行尾( \\n\\r )替換行尾字符( \\n )。 禁止此轉換是std::ios_base::binary標志的唯一目的。

請注意,轉換是對寫入流的字節進行的。 也就是說,與write()的第二個參數相比,實際寫入的字節數將增加。 另請注意,您需要確保使用的是"C"語言環境,而不是使用具有非平凡代碼轉換方面的語言環境(因為您沒有在代碼中顯式設置全局std::locale ,默認為"C"語言環境)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM