Read a file into a byte array

From CodeCodex

Implementations[edit]

C[edit]

#include <stdio.h>
#include <stdlib.h>

char* readFileBytes(const char *name)
{
    FILE *fl = fopen(name, "r");
    fseek(fl, 0, SEEK_END);
    long len = ftell(fl);
    char *ret = malloc(len);
    fseek(fl, 0, SEEK_SET);
    fread(ret, 1, len, fl);
    fclose(fl);
    return ret;
}

C++[edit]

#include <iostream>
#include <fstream>

char* readFileBytes(const char *name)
{
    ifstream fl(name);
    fl.seekg( 0, ios::end );
    size_t len = fl.tellg();
    char *ret = new char[len];
    fl.seekg(0, ios::beg); 
    fl.read(ret, len);
    fl.close();
    return ret;
}

C#[edit]

var bytes = System.IO.File.ReadAllBytes(name);

Common Lisp[edit]

The following does not work with multibyte streams. The common lisp stream must be single-byte for this particular function.

; here's the function
(defun slurp-stream4 (stream)
  (let ((seq (make-string (file-length stream))))
    (read-sequence seq stream)
    seq))

;open up a stream:
(with-open-file (stream "filename.txt"))
  ;; call the function and return the string.
  (slurp-stream4 stream))

This is from [1].

Haskell[edit]

import qualified Data.ByteString as BS
getBytesFromFile = BS.readFile

Java[edit]

This method reads the entire content of a file into a byte array.

// Returns the contents of the file in a byte array.
public static byte[] getBytesFromFile(File file) throws IOException {
    InputStream is = new FileInputStream(file);
    byte[] bytes;
        
    try {
        // Get the size of the file
        long length = file.length();
        
        // You cannot create an array using a long type.
        // It needs to be an int type.
        // Before converting to an int type, check
        // to ensure that file is not larger than Integer.MAX_VALUE.
        if (length > Integer.MAX_VALUE) {
            // File is too large (>2GB)
        }
    
        // Create the byte array to hold the data
        bytes = new byte[(int)length];
    
        // Read in the bytes
        int offset = 0;
        int numRead = 0;
        while (offset < bytes.length
               && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
            offset += numRead;
        }
    
        // Ensure all the bytes have been read in
        if (offset < bytes.length) {
            throw new IOException("Could not completely read file " + file.getName());
        }
    }
    finally {
        // Close the input stream and return bytes
        is.close();
    }
    return bytes;
}

OCaml[edit]

# let get_bytes_from_file filename =
    let ch = open_in filename in
    let buf = Buffer.create 1024 in
    (try Buffer.add_channel buf ch max_int with _ -> ());
    close_in ch;
    buf;;
val get_bytes_from_file : string -> Buffer.t = <fun>

Perl[edit]

use File::Slurp (read_file);
my $slurped = read_file('filename');

Python[edit]

Python 2.x's "str" type acts as an (immutable) byte array (not a true char array), so the following suffices:

def get_bytes_from_file(filename):
    return open(filename, "rb").read()

Ruby[edit]

Since String objects 'hold and manipulate an arbitrary sequence of bytes' (Source), simply reading a file into a String will suffice.

def get_bytes_from_file(filename)
  File.read(filename)
end