Si lo hace como lo siguiente (pero adecuadamente envuelto bien al contrario más adelante), se puede leer en el archivo sin tener que preocuparse por un byte 0x1A en el archivo (por ejemplo) cortando la lectura del archivo corto. Los métodos sugeridos anteriormente se ahogarán con un 0x1A (por ejemplo) en un archivo.
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstdlib>
using namespace std;
int main() {
FILE* in = fopen("filename.txt", "rb");
if (in == NULL) {
return EXIT_FAILURE;
}
if (fseek(in, 0, SEEK_END) != 0) {
fclose(in);
return EXIT_FAILURE;
}
const long filesize = ftell(in);
if (filesize == -1) {
fclose(in);
return EXIT_FAILURE;
}
vector<unsigned char> buffer(filesize);
if (fseek(in, 0, SEEK_SET) != 0 || fread(&buffer[0], sizeof(buffer[0]), buffer.size(), in) != buffer.size() || ferror(in) != 0) {
fclose(in);
return EXIT_FAILURE;
}
fclose(in);
}
Pero, sí, no es un 1-line ya implementado.
Editar: 0x1A no fue un buen ejemplo ya que ios_base :: binary cubrirá eso. Sin embargo, incluso las transmisiones en C++ a menudo me dan problemas al leer en archivos PNG todo de una vez con .read(). Usar la forma C funciona mejor. Simplemente no puedo recordar un buen ejemplo para mostrar por qué. Probablemente con .read() ing un archivo binario en bloques en un bucle en su lugar puede ser un problema con las transmisiones en C++. Por lo tanto, ignora esta publicación.
Acaba de utilizar el operador ',', esencialmente es como poner un montón de declaraciones con un punto y coma entre ellas en una línea. Pero incluso con eso, supera al mío por debajo de una línea, lindo. –
Si usa un istreambuf_iterator (vea el comentario de Martin York en mi publicación) puede olvidarse de los noskipws. –
Otro comentario, ifstream es temporal, ¿puedes asegurarte de que no se cerrará mientras todavía tenemos istream_iterators? Sería la evaluación de esto ser específica del compilador. –