Domanda

Sapevo che non avrei mai dovuto iniziare a usare c ++ io, l'intera "sicurezza di tipo" l'argomento è un'aringa rossa (qualcuno davvero trova che è uno dei loro problemi più urgenti?). Comunque, l'ho fatto e ho scoperto una strana differenza tra ifstreams e FILE * se semplici descrittori di file: ifstreams non è in grado di leggere da un dispositivo. Qualcuno può pensare a un motivo per cui?

const char* path = "/dev/disk3";
char        b;

// this works
FILE* f= fopen(path, "rb");
int i = fread(&b, 1, 1, f);     // returns 1, success!

// this does not work
ifstream    cf(path, ios::binary);
cf.read(&b, 1);
bool        good = cf.good();   // returns false, failure.
È stato utile?

Soluzione 2

Il dispositivo è senza buffer e deve essere letto da multipli di 512 byte. ifstream fa il proprio buffering e stranamente ha deciso di leggere 1023 byte, il che fallisce con "Argomento non valido". È interessante notare che questo ifstream è implementato su un FILE *. Tuttavia, FILE * lasciato ai propri dispositivi stava leggendo in anticipo usando un numero di byte più bello e più rotondo.

Grazie a dtrace per gli indizi vitali. Immagino che non sapremo mai se la gente che pensava di conoscere la risposta, ma non voleva dire, aveva ragione.

Altri suggerimenti

Funziona bene per me, non è un problema inerente all'I / O del file di flusso c ++ come sembri pensare.

Forse prova ad aggiungere ios :: in ai flag openmode. Secondo il 27.8.1.6 dello standard, è richiesto da o con ios :: in, quindi probabilmente questo non farà nulla.

Prova a verificare quale bit è effettivamente impostato - invece di chiamare good (), prova a controllare bad (), eof () e fail () singolarmente. Questo potrebbe dare un'idea di quale fosse l'errore.

Ho riscontrato problemi casuali come questo nell'I / O C ++ per anni. Mi è sempre sembrato un passo indietro.

Non l'ho provato, ma potresti voler dare un'occhiata a ciò che Boost ha da offrire:

http://www.boost.org /doc/libs/1_36_0/libs/iostreams/doc/index.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top