Search code examples
c++bufferfgetsnull-terminated

C++: Store read binary file into buffer


I'm trying to read a binary file and store it in a buffer. The problem is, that in the binary file are multiple null-terminated characters, but they are not at the end, instead they are before other binary text, so if I store the text after the '\0' it just deletes it in the buffer.

Example:

char * a = "this is a\0 test";
cout << a;

This will just output: this is a

here's my real code:

this function reads one character

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

    int iReturn = 0;

     *_OutChar = fgetc (pFile);

    if (*_OutChar == EOF)
        return false;

    return true;
}

And this is how I use it:

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

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

Solution

  • I just want to mention that there is a standard way to read from a binary file into a buffer.

    Using <cstdio>:

    char buffer[BUFFERSIZE];
    
    FILE * filp = fopen("filename.bin", "rb"); 
    int bytes_read = fread(buffer, sizeof(char), BUFFERSIZE, filp);
    

    Using <fstream>:

    std::ifstream fin("filename.bin", ios::in | ios::binary );
    fin.read(buffer, BUFFERSIZE);
    

    What you do with the buffer afterwards is all up to you of course.

    Edit: Full example using <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;
    }