sen gibi yaparsanız, dosyasında bir 0x1A byte endişelenmeden dosyasında okuyabilirsiniz aşağıdaki (ancak düzgün güzel aşağıda aksine sarılmış) (örneğin) kısa dosya okuma kesme. Önceden önerilen yöntemler bir dosyada bir 0x1A'yı (örneğin) tıkayacaktır.
#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);
}
Ancak, zaten uygulanan bir 1-liner değil.
Düzenleme: 0x1A, ios_base :: binary'nin bunu kapsayacağı gibi iyi bir örnek değildi. Bununla birlikte, daha sonra C++ akışları bile png dosyalarında bir kerede .read() ile okurken sıkıntı verir. C yolunu kullanmak daha iyi çalışır. Sadece nedenini göstermek için iyi bir örnek hatırlayamıyorum. Büyük olasılıkla .read() ile bir döngüsündeki bloklar halinde ikili bir dosya oluşturmak yerine C++ akışlarıyla ilgili bir problem olabilirdi. Yani, bu yazıyı dikkate almayın.
Sadece ',' işlecini kullandınız, aslında bir satırda aralarında noktalı virgül içeren bir sürü ifade koymak gibi. Ama bununla birlikte, benimki bir çizgiyi alttan geçirir, güzel. –
Bir istreambuf_iterator kullanırsanız (bkz. Martin York'un gönderimime ilişkin yorumu) noskipws'ı unutabilirsiniz. –
Başka bir yorum, ifstream geçicidir, buna rağmen yine de sizin için istream_iterators olurken kapanmayacağından emin misiniz? Bu değerlendirmeyi derleyici özel olurdu. –