C++:将读取的二进制文件存储到缓冲区中

sch*_*r22 6 c++ buffer fgets null-terminated

我正在尝试读取二进制文件并将其存储在缓冲区中.问题是,在二进制文件中是多个以空字符结尾的字符,但它们不在最后,而是在其他二进制文本之前,所以如果我将文本存储在'\ 0'之后它只是删除它缓冲.

例:

char * a = "this is a\0 test";
cout << a;
Run Code Online (Sandbox Code Playgroud)

这只会输出: this is a

这是我的真实代码:

此函数读取一个字符

bool CStream::Read  (int * _OutChar)
{
    if (!bInitialized)
        return false;

    int iReturn = 0;

     *_OutChar = fgetc (pFile);

    if (*_OutChar == EOF)
        return false;

    return true;
}
Run Code Online (Sandbox Code Playgroud)

这就是我使用它的方式:

    char * SendData = new char[4096 + 1];

    for (i = 0; i < 4096; i++)
    {
        if (Stream.Read (&iChar))
            SendData[i] = iChar;
        else
            break;
    }
Run Code Online (Sandbox Code Playgroud)

Sti*_*org 9

我只想提一下,有一种从二进制文件读入缓冲区的标准方法.

使用<cstdio>:

char buffer[BUFFERSIZE];

FILE * filp = fopen("filename.bin", "rb"); 
int bytes_read = fread(buffer, sizeof(char), BUFFERSIZE, filp);
Run Code Online (Sandbox Code Playgroud)

使用<fstream>:

std::ifstream fin("filename.bin", ios::in | ios::binary );
fin.read(buffer, BUFFERSIZE);
Run Code Online (Sandbox Code Playgroud)

你事后用缓冲区做什么当然都取决于你.

编辑:使用完整示例 <cstdio>

#include <cstdio>

const int BUFFERSIZE = 4096;    

int main() {
    const char * fname = "filename.bin";
    FILE* filp = fopen(fname, "rb" );
    if (!filp) { printf("Error: could not open file %s\n", fname); return -1; }

    char * buffer = new char[BUFFERSIZE];
    while ( (int bytes = fread(buffer, sizeof(char), BUFFERSIZE, filp)) > 0 ) {
        // Do something with the bytes, first elements of buffer.
        // For example, reversing the data and forget about it afterwards!
        for (char *beg = buffer, *end=buffer + bytes; beg < end; beg++, end-- ) {
           swap(*beg, *end);
        }
    }

    // Done and close.
    fclose(filp);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • @ schacker22你可能仍然可以用fread而不是fget读取你的小缓冲区.fread说你必须一次性阅读*整个*文件. (2认同)

Nei*_*ill 6

static std::vector<unsigned char> read_binary_file (const std::string filename)
{
    // binary mode is only for switching off newline translation
    std::ifstream file(filename, std::ios::binary);
    file.unsetf(std::ios::skipws);

    std::streampos file_size;
    file.seekg(0, std::ios::end);
    file_size = file.tellg();
    file.seekg(0, std::ios::beg);

    std::vector<unsigned char> vec;
    vec.reserve(file_size);
    vec.insert(vec.begin(),
               std::istream_iterator<unsigned char>(file),
               std::istream_iterator<unsigned char>());
    return (vec);
}
Run Code Online (Sandbox Code Playgroud)

进而

auto vec = read_binary_file(filename);
auto src = (char*) new char[vec.size()];
std::copy(vec.begin(), vec.end(), src);
Run Code Online (Sandbox Code Playgroud)