2013-01-03 37 views
5

Đây là một câu hỏi đơn giản mà tôi hy vọng có thể được trả lời dễ dàng, các hoạt động đọc và ghi luồng có di chuyển con trỏ không? Như một ví dụ:hiện con trỏ tập tin di chuyển fstream đọc/ghi

cpos=10000; 
for (i=0;i<20;i++) { 
    dataFile.seekg(cpos+i,ios::beg); 
    dataFile.read(carray[i],1); 
} 

Có giống hệt nhau (logic) tới:

dataFile.seekg(cpos,ios::beg);  
cpos=10000; 
for (i=0;i<20;i++) { 
    dataFile.read(carray[i],1); 
} 

Nói cách khác, không carray [] chứa nội dung giống nhau bất kể phương pháp được sử dụng (tôi có thể không nhìn thấy phương pháp đầu tiên là hiệu quả vì vậy tôi hy vọng rằng câu trả lời đúng là có). Nếu vậy, hành vi tương tự được thể hiện bởi các hoạt động ghi?

Trả lời

5

Vâng, đó là cách hoạt động của nó. Ví dụ của bạn không hoàn toàn giống nhau. Ví dụ đầu tiên của bạn đọc từ 10000, sau đó là 10001, sau đó là 10002, v.v. Thứ hai cần tìm kiếm bên ngoài vòng lặp để đặt vị trí ban đầu. Để tương đương 100%, bạn cần có ví dụ thứ hai của mình như sau:

cpos=10000; 
dataFile.seekg(cpos,ios::beg); 
for (i=0;i<20;i++) { 
    dataFile.read(carray[i],1); 
} 
+0

Xin lỗi, tôi biết rằng - Tôi chỉ đơn thuần là chứng minh người không tìm kiếm trong vòng lặp. Cám ơn vì đã xác nhận. – mlewis54

1

Có, con trỏ tệp được tự động di chuyển bằng các hoạt động đọc và ghi. ... và không phải tìm kiếm cải thiện hiệu suất nhiều lô. Ngoài ra, sử dụng file.read(ptr, 20) nhanh hơn rất nhiều so với sử dụng 20 lần file.read(ptr + i, 1). Để có cùng ngữ nghĩa, bạn sẽ cần phải điều hướng đến vị trí thích hợp, tuy nhiên, bằng cách sử dụng một tìm kiếm.

Tìm kiếm trong luồng tệp đặt luồng vào trạng thái có thể tiếp tục đọc hoặc viết ký tự: Để chuyển đổi giữa đọc và ghi cho luồng được mở ở chế độ đọc/ghi (std::ios_base::in | std::ios_base::out), bạn cần phải giới thiệu tìm kiếm. Do đó, mỗi lần xem, thiết lập bộ đệm có sẵn theo cách hài hước mà luồng không cần phải làm nếu nó chỉ đọc hoặc viết một chuỗi các ký tự. Ngoài ra, khi viết mỗi tìm kiếm ít nhất là kiểm tra xem nó là cần thiết để viết ký tự để có được thành một trạng thái ban đầu để chuyển đổi mã.

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