2012-02-22 28 views
10

khi tôi đọc từ một tập tin sử dụng fread (ngôn ngữ C), giá trị trả về của hàm fread đôi khi sẽ là 0.do fread và fwrite có lỗi? làm thế nào để xử lý này?

Là nhãn hiệu gợi ý:

fread() và fwrite() trả lại số các mục đã đọc thành công hoặc được viết

Tôi có phải viết mã như thế này không?

int bytes_read; 
while((bytes_read = fread(buffer, sizeof(int), 1, fp)) == 0) { 

} 

chúng ta luôn phải kiểm tra xem fread hoặc fwrite có thành công không?

Trả lời

11

Không, không có ý nghĩa khi thực hiện thử lại vòng lặp như thế này nếu fread hoặc fwrite trả lại ít hơn số lượng bản ghi dự kiến ​​được đọc hoặc ghi. Đó là để nói, stdio không giống như các hoạt động readwrite cấp thấp có thể dẫn đến việc đọc hoặc viết "ngắn".

Nếu fread trả lại ít hơn số lượng bản ghi được yêu cầu, bạn đã đạt đến EOF hoặc lỗi đọc nghiêm trọng. Bạn có thể phân biệt chúng bằng cách kiểm tra feof()ferror().

Tương tự, nếu fwrite trả lại ít hơn số lượng bản ghi được yêu cầu, bạn đã hết dung lượng đĩa hoặc gặp phải lỗi ghi nghiêm trọng.

Trong mọi trường hợp, do đệm stdio làm cho nó về cơ bản không thể biết bao nhiêu đã được viết thành công, vì vậy nếu bạn gặp phải một lỗi ghi, bạn thường cần phải xem xét các tập tin bị mất và hủy bỏ toàn bộ hoạt động.

0

Có.

Giá trị trả về phải luôn là đếm.

Nếu không - bạn nên sử dụng ferror() hoặc feof() để xác định liệu bạn đã đến cuối tệp và/hoặc gặp phải lỗi.

Bỏ qua lỗi và/hoặc điều kiện không mong muốn là những thứ mà từ đó phần mềm không đáng tin cậy được sử dụng cho những người dùng không ngờ.

http://www.cplusplus.com/reference/clibrary/cstdio/fread/ < - Junk

http://pubs.opengroup.org/onlinepubs/000095399/functions/fread.html

+1

Không, giá trị trả về là 'đếm', không phải là' kích thước * đếm', khi toàn bộ thao tác thành công. –

+0

@R .. - Uh ... Tôi không nghĩ điều đó đúng. Bạn có chắc không? Bạn có tài liệu không đồng ý với tài liệu tôi đăng không? – Steve

+0

@R .. - Tôi khá chắc chắn rằng nếu bạn yêu cầu các mục "5" có kích thước "10" thì câu trả lời phải là "50" chứ không phải "5". – Steve

4

http://pubs.opengroup.org/onlinepubs/000095399/functions/fread.html

Sau khi hoàn thành, fread() có trách nhiệm trả về số lượng các thành phần được đọc thành công, chỉ nhỏ hơn nitems nếu gặp lỗi đọc hoặc kết thúc tập tin. Nếu kích thước hoặc nitems là 0, fread() sẽ trả về 0 và nội dung của mảng và trạng thái của luồng vẫn không thay đổi. Nếu không, nếu một lỗi đọc xảy ra, chỉ báo lỗi cho luồng sẽ được thiết lập, và errno sẽ được thiết lập để cho biết lỗi.

http://pubs.opengroup.org/onlinepubs/007904875/functions/fwrite.html

Các fwrite() chức năng có trách nhiệm trả lại số yếu tố được viết thành công, mà có thể ít hơn nitems nếu một lỗi ghi là gặp phải. Nếu kích thước hoặc nitems là 0, fwrite() sẽ trả về 0 và trạng thái của luồng vẫn không đổi. Nếu không, nếu xảy ra lỗi ghi, chỉ báo lỗi cho luồng sẽ được đặt và sẽ không được đặt để chỉ báo lỗi

Chức năng ferror() hoặc feof() phải được sử dụng để phân biệt giữa điều kiện lỗi và điều kiện cuối tệp.

0

Nếu lỗi không thành công, thông thường sẽ không bị lỗi. Thông thường vì nó nhấn vào cuối tập tin, nhưng có thể vì một số lý do khác. Nếu nó không thành công, bạn thường sẽ không thử lại.

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