Non riesco a trovare alcun riferimento al comportamento specificato di fputc()
quando lo stream è stato creato con fopen("/some/path", "r")
.Comportamento di fputc() per un flusso aperto con modalità di lettura
Ho cercato il pdf C11 Draft n1570 cercando qualsiasi riferimento senza fortuna, la specifica della funzione fopen()
parla del passaggio di caratteri sconosciuti come parametro di modalità che è un comportamento non definito. Ma non dice nulla sull'IO successivo nel flusso creato.
Questa è la specifica funzione fwrite()
7.21.8.2 La funzione
fwrite
Trama
#include <stdio.h> size_t fwrite(const void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream);
Descrizione
- La funzione
fwrite
scrive, dalla matrice puntato daptr
, fino anmemb
elementi la cui dimensione è specificato dasize
, nel flusso puntato dastream
. Per ogni oggetto, le chiamate di dimensioni vengono effettuate alla funzionefputc
, prendendo i valori (in ordine) da una matrice diunsigned char
sovrapponendo esattamente l'oggetto. L'indicatore di posizione del file per lo stream (se definito) viene anticipato dal numero di caratteri scritti correttamente. Se si verifica un errore, il valore risultante dell'indicatore di posizione del file per il flusso è indeterminato.Returns
- La
fwrite
funzione restituisce il numero di elementi scritti con successo, che sarà inferiore anmemb
solo se viene rilevato un errore di scrittura. Sesize
onmemb
è zero,fwrite
restituisce zero e lo stato del flusso rimane invariato.
ci porta alla funzione fputc()
, così
7.21.7.3 La
fputc
funzioneSinossi
#include <stdio.h> int fputc(int c, FILE *stream);
Descrizione
- La funzione
fputc
scrive il carattere specificato dac
(convertito in ununsigned char
) al flusso di output indicato dastream
, nella posizione indicata dall'indicatore di posizione file associato per il flusso (se definito), e avanza l'indicatore in modo appropriato. Se il file non supporta le richieste di posizionamento o se il flusso è stato aperto con la modalità append, il carattere viene aggiunto al flusso di output.Returns
- La funzione
fputc
restituisce il carattere scritto. Se si verifica un errore di scrittura, viene impostato l'indicatore di errore per il flusso efputc
restituisceEOF
.
Come si può vedere, non c'è una spiegazione della situazione che mi preoccupa.
Probabilmente è UB. –
Se questo non rientra nella dicitura "omissione" nella sezione 4, paragrafo 2 ("Il comportamento indefinito è altrimenti indicato in questo standard internazionale dalle parole" comportamento indefinito "o dall'omissione di qualsiasi definizione esplicita di comportamento."), allora questo potrebbe essere un difetto nella definizione di file e flussi (7.21.1, 7.21.2). Non riesco a vedere alcuna definizione pertinente per la dicitura "apri un file per la lettura" di 'fopen' che definisca come le operazioni di non lettura si comportano con il flusso risultante. Penserei che il comportamento * dovrebbe * essere che conterebbero come errori di scrittura (vedere le clausole citate 3). –
@iharob * ... Mi è capitato di accidentalmente fprintf() a un flusso aperto con "r", ha funzionato ... * Sono curioso dei dettagli su dove "ha funzionato". Penso che la chiamata di base 'open()' (o equivalente) verrebbe eseguita con flag per trovare corrispondenza con 'fopen ("/some/path "," r ");'. –