Read a file into a byte array
Contents[hide] |
[edit] Implementations
[edit] C
- #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;
- }
[edit] C++
- #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;
- }
[edit] C#
- var bytes = System.IO.File.ReadAllBytes(name);
[edit] Common Lisp
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].
[edit] Java
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;
- }
[edit] OCaml
# 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>
[edit] Perl
use File::Slurp (read_file); my $slurped = read_file('filename');
[edit] Python
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()
[edit] Ruby
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