2015-11-24 38 views
9

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

  1. #include <stdio.h> 
    size_t fwrite(const void * restrict ptr, 
        size_t size, size_t nmemb, FILE * restrict stream); 
    

Descrizione

  1. La funzione fwrite scrive, dalla matrice puntato da ptr, fino a nmemb elementi la cui dimensione è specificato da size, nel flusso puntato da stream . Per ogni oggetto, le chiamate di dimensioni vengono effettuate alla funzione fputc, prendendo i valori (in ordine) da una matrice di unsigned 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

  1. La fwrite funzione restituisce il numero di elementi scritti con successo, che sarà inferiore a nmemb solo se viene rilevato un errore di scrittura. Se size o nmemb è zero, fwrite restituisce zero e lo stato del flusso rimane invariato.

ci porta alla funzione fputc(), così

7.21.7.3 La fputc funzione

Sinossi

  1. #include <stdio.h> 
    int fputc(int c, FILE *stream); 
    

Descrizione

  1. La funzione fputc scrive il carattere specificato da c (convertito in un unsigned char) al flusso di output indicato da stream, 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

  1. La funzione fputc restituisce il carattere scritto. Se si verifica un errore di scrittura, viene impostato l'indicatore di errore per il flusso e fputc restituisce EOF.

Come si può vedere, non c'è una spiegazione della situazione che mi preoccupa.

+1

Probabilmente è UB. –

+3

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). –

+0

@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 ");'. –

risposta

5

Questo comportamento non è definito, lo standard non definisce il comportamento se non è un flusso di output. Questo è dalla sezione 4 conformità che dice (sottolineatura mia):

Se un '' deve '' o '' non sono '' requisito che appare al di fuori di un vincolo o di runtime vincolo viene violato, il il comportamento non è definito. Il comportamento non definito è altrimenti indicato in in questo standard internazionale con le parole "comportamento non definito" o con l'omissione di qualsiasi definizione esplicita di comportamento. Non c'è differenza di enfasi tra questi tre; descrivono tutti "comportamenti non definiti".

Ora, naturalmente, questo non impedisce l'applicazione da definire ulteriormente il comportamento e possiamo vedere che per POSIX fputc indica questo errore attraverso EBADF:

[EBADF]

[ CX] [Inizio opzione] Il descrittore di file sottostante al flusso non è un descrittore di file valido aperto per la scrittura.

Nota CX denota un'estensione dello standard C.