2015-11-24 28 views
9

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ăng

Tóm tắt

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

Mô tả

  1. Chức năng fwrite viết, từ mảng trỏ đến bởi ptr, lên đến nmemb yếu tố có kích thước được xác định bởi size, cho luồng dữ liệu được trỏ đến bởi stream . Đố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àm fputc, lấy các giá trị (theo thứ tự) từ một mảng unsigned 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

  1. Các fwrite hàm trả về số phần tử được viết thành công, đó sẽ ít hơn nmemb chỉ khi một lỗi ghi là gặp phải. Nếu size hoặc nmemb 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ăng

Tóm tắt

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

Mô tả

  1. Chức năng fputc viết nhân vật theo quy định của c (được chuyển đổi thành unsigned char) thành luồng đầu ra được chỉ định bởi stream, 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

  1. 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.

+1

Có thể là UB. –

+3

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

+0

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

Trả lời

5

Đây là hành vi không xác định, tiêu chuẩn không xác định hành vi nếu nó không phải là luồng đầu ra. Đây là từ phần 4 sự phù hợp mà nói (tôi nhấn mạnh):

Nếu một '' trách nhiệm '' hoặc '' thì không '' yêu cầu xuất hiện bên ngoài của một hạn chế hoặc thời gian chạy chế được vi phạm, hành vi là không xác định. Hành vi không xác định là nếu không chỉ định trong tiêu chuẩn này theo các từ ‘hành vi không xác định’ ’hoặc bằng cách bỏ sót bất kỳ định nghĩa rõ ràng nào về hành vi. Không có sự khác biệt nào trong việc nhấn mạnh trong số ba điều này; tất cả đều mô tả ‘hành vi không xác định’ ’.

Bây giờ tất nhiên điều này không ngăn cản việc thực hiện từ xác định thêm hành vi và chúng ta có thể thấy rằng đối với POSIX fputc chỉ ra lỗi này thông qua EBADF:

[EBADF]

[ CX] [Tùy chọn bắt đầu] Dòng mô tả tệp bên dưới không phải là bộ mô tả tệp hợp lệ để mở.

Lưu ý CX biểu thị phần mở rộng cho tiêu chuẩn C.

Các vấn đề liên quan