Tôi không thể tìm thấy bất kỳ tham chiếu nào đến hành vi được chỉ định của fputc()
khi luồng được tạo bằng fopen("/some/path", "r")
.Hành vi của fputc() đối với luồng được mở bằng chế độ đọc
Tôi đã tìm kiếm C11 Draft n1570 pdf tìm kiếm bất kỳ tham chiếu nào không có may mắn, các cuộc hội thoại đặc điểm chức năng fopen()
về truyền các ký tự không xác định làm tham số chế độ không xác định. Nhưng nó không nói bất cứ điều gì về IO tiếp theo trên dòng được tạo ra.
Đây là fwrite()
chức năng đặc điểm kỹ thuật
7.21.8.2 Các
fwrite
chức năngTóm tắt
#include <stdio.h> size_t fwrite(const void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream);
Mô tả
- Chức năng
fwrite
viết, từ mảng trỏ đến bởiptr
, lên đếnnmemb
yếu tố có kích thước được xác định bởisize
, cho luồng dữ liệu được trỏ đến bởistream
. Đối với mỗi đối tượng, các cuộc gọi kích thước được thực hiện cho hàmfputc
, lấy các giá trị (theo thứ tự) từ một mảngunsigned char
chính xác chồng lên đối tượng. Chỉ báo vị trí tệp cho luồng (nếu được xác định) được nâng cao bằng số ký tự được viết thành công. Nếu xảy ra lỗi, giá trị kết quả của chỉ báo vị trí tệp cho luồng không xác định.Returns
- Các
fwrite
hàm trả về số phần tử được viết thành công, đó sẽ ít hơnnmemb
chỉ khi một lỗi ghi là gặp phải. Nếusize
hoặcnmemb
bằng 0,fwrite
trả về 0 và trạng thái của luồng vẫn không thay đổi.
Nó đưa chúng ta đến fputc()
chức năng, vì vậy
7.21.7.3
fputc
chức năngTóm tắt
#include <stdio.h> int fputc(int c, FILE *stream);
Mô tả
- Chức năng
fputc
viết nhân vật theo quy định củac
(được chuyển đổi thànhunsigned char
) thành luồng đầu ra được chỉ định bởistream
, tại vị trí được chỉ báo bằng chỉ báo vị trí tệp được liên kết cho luồng (nếu được xác định) và tiến hành chỉ báo một cách thích hợp. Nếu tệp không thể hỗ trợ yêu cầu định vị hoặc nếu luồng được mở bằng chế độ nối thêm, ký tự sẽ được nối vào luồng đầu ra.Returns
- Chức năng
fputc
trả về nhân vật bằng văn bản. Nếu xảy ra lỗi ghi, chỉ báo lỗi cho luồng được đặt vàfputc
trả vềEOF
.
Như bạn thấy, không có giải thích về tình huống mà tôi quan tâm.
Có thể là UB. –
Nếu điều này không nằm trong từ "thiếu sót" trong phần 4 khoản 2 ("Hành vi không xác định được nêu khác trong tiêu chuẩn này bằng các từ" hành vi không xác định "hoặc do thiếu định nghĩa rõ ràng về hành vi."), thì điều này có thể là một thiếu sót trong định nghĩa của các tệp và luồng (7.21.1, 7.21.2). Tôi không thể thấy bất kỳ định nghĩa có liên quan nào cho từ "mở một tệp để đọc" của fopen' để xác định cách hoạt động không đọc hoạt động với luồng kết quả. Tôi nghĩ rằng hành vi * nên * được rằng họ sẽ được tính là lỗi viết (xem mệnh đề trích dẫn 3). –
@iharob * ... Nó xảy ra với tôi rằng tôi vô tình fprintf() ed vào một dòng mở ra với "r", nó làm việc ... * Tôi tò mò về các chi tiết mà "làm việc". Tôi nghĩ rằng cuộc gọi bên dưới 'open()' (hoặc tương đương) sẽ được thực hiện với các cờ để khớp với 'fopen ("/some/path "," r ");'. –