Nie można znaleźć żadnego odwołania do określonego zachowania fputc()
, gdy strumień został utworzony za pomocą fopen("/some/path", "r")
.Zachowanie funkcji fputc() dla strumienia otwartego w trybie odczytu
Przeszukałem plik C11 Draft n1570 pdf, szukając odniesienia bez powodzenia, specyfikacja funkcji fopen()
mówi o przekazywaniu nieznanych znaków jako parametr trybu, który jest niezdefiniowanym zachowaniem. Ale nie mówi nic o kolejnym IO w stworzonym strumieniu.
To określenie fwrite()
funkcja
7.21.8.2 Funkcja
fwrite
Streszczenie
#include <stdio.h> size_t fwrite(const void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream);
Opis
- Funkcja
fwrite
zapisuje z matrycy wskazywanego przezptr
, donmemb
elementów, których wielkość jest określona przezsize
, do strumienia wskazywanego przezstream
. Dla każdego obiektu wywołania rozmiaru są wprowadzane do funkcjifputc
, przyjmując wartości (w kolejności) z tablicy dokładnie pokrywającej obiekt. Wskaźnik pozycji pliku dla strumienia (jeśli został zdefiniowany) jest przesuwany o liczbę pomyślnie wpisanych znaków. Jeśli wystąpi błąd, wynikowa wartość wskaźnika położenia pliku dla strumienia jest nieokreślona.Zwraca
fwrite
funkcja zwraca liczbę elementów z powodzeniem napisane, którego będzie mniejsza niżnmemb
tylko wtedy, gdy błąd zapisu spotyka. Jeślisize
lubnmemb
ma wartość zero,fwrite
zwraca zero, a stan strumienia pozostaje niezmieniony.
To prowadzi nas do funkcji fputc()
, więc
7.21.7.3
fputc
funkcjaStreszczenie
#include <stdio.h> int fputc(int c, FILE *stream);
Opis
- Funkcja
fputc
zapisuje się znak określony przezc
(przekształcony naunsigned char
) na strumień wyjściowy wskazywany przezstream
, w położeniu wskazanym przez skojarzony wskaźnik położenia pliku dla strumienia (jeśli został zdefiniowany) i odpowiednio przesuwa wskaźnik. Jeśli plik nie obsługuje żądań pozycjonowania lub jeśli strumień został otwarty w trybie dołączania, znak jest dołączany do strumienia wyjściowego.Zwraca
- Funkcja
fputc
zwraca znak pisemnej. Jeśli wystąpi błąd zapisu, wskaźnik błędu dla strumienia jest ustawiony ifputc
zwracaEOF
.
Jak widać, nie ma wyjaśnienia sytuacji, której się niepokoję.
To prawdopodobnie UB. –
Jeśli nie jest to objęte słowem "zaniechanie" w rozdziale 4 zdanie 2 ("Niezdefiniowane zachowanie jest inaczej wskazane w niniejszym międzynarodowym standardzie słowami" niezdefiniowane zachowanie "lub przez pominięcie jakiejkolwiek wyraźnej definicji zachowania."), to może być niedociągnięcie w definicji plików i strumieni (7.21.1, 7.21.2). Nie widzę żadnej istotnej definicji dla słowa "otwórz plik do odczytu" 'fopen', które określałoby zachowanie się operacji nie czytających względem strumienia wynikowego. Sądzę, że zachowanie * powinno * polegać na tym, że liczą się jako błędy zapisu (patrz zacytowane punkty 3). –
@iharob * ... Zdarzyło mi się, że przypadkowo fprintf() do strumienia otwartego z "r" zadziałało ... * Ciekaw jestem co do szczegółów, gdzie to "działało". Myślę, że podstawowe wywołanie 'open()' (lub równoważne) byłoby wykonane z flagami dopasowanymi do 'fopen ("/some/path "," r ");'. –