2013-04-29 29 views
6

Tôi vừa mới bắt đầu tự hỏi - làm thế nào thực sự là std::fstream được mở với cả hai std::ios::instd::ios::out thực sự phải hoạt động? Nó nên làm gì? Viết một cái gì đó để (ví dụ) một tập tin trống, sau đó đọc ... cái gì? Chỉ cần viết giá trị? Tập tin "con trỏ"/"con trỏ" ở đâu? Có lẽ câu trả lời đã có nhưng tôi không thể tìm thấy nó.Làm thế nào là std :: fstream với cả trong và ngoài nghĩa vụ phải làm việc?

Trả lời

5

std::fstream là gì?

std::fstream là lớp luồng tệp hai chiều. Nghĩa là, nó cung cấp một giao diện cho cả đầu vào và đầu ra cho các tệp. Nó thường được sử dụng khi người dùng cần đọc và ghi vào cùng một chuỗi bên ngoài.

Khi instantiating một dòng tập tin hai chiều (không giống như std::ofstream hoặc std::ifstream), các openmodes ios_base::inios_base::out được quy định theo mặc định. Điều này có nghĩa rằng đây:

std::fstream f("test.txt", std::ios_base::in | std::ios_base::out); 

cũng giống như

std::fstream f("test.txt"); 

Một sẽ xác định cả hai lựa chọn nếu họ cần cũng thêm một số openmodes không mặc định như trunc, ate, app, hoặc binary. Cần có mã mở ios_base::trunc nếu bạn định tạo một tệp mới cho I/O hai chiều, vì mã mở ios_base::in vô hiệu hóa việc tạo tệp mới.

hai chiều I/O

hai chiều I/O là việc sử dụng của một dòng hai chiều cho cả đầu vào và đầu ra. Trong IOStreams, các luồng chuẩn duy trì chuỗi ký tự của chúng trong bộ đệm, nơi nó hoạt động như một nguồn hoặc chìm cho dữ liệu. Đối với các luồng đầu ra, có một vùng "put" (bộ đệm chứa ký tự cho đầu ra). Tương tự, đối với luồng đầu vào, có vùng "get".

Trong trường hợp std::fstream (một lớp cho cả đầu vào đầu ra), nó chứa bộ đệm tệp chung thể hiện cả khu vực nhận và đặt tương ứng. Chỉ báo vị trí đánh dấu vị trí hiện tại trong tệp bị ảnh hưởng bởi cả hoạt động đầu ra đầu ra. Do đó, để thực hiện I/O chính xác trên luồng hai chiều, có một số quy tắc nhất định bạn phải tuân thủ:

  • Khi bạn đọc sau khi viết hoặc ngược lại, luồng sẽ được đặt lại vị trí.
  • Nếu thao tác nhập vào cuối tập tin, thực hiện ghi trực tiếp sau đó sẽ ổn.

Điều này chỉ đề cập đến std::fstream. Các quy tắc trên không cần thiết cho std::stringstream.

Tôi hy vọng những câu hỏi này sẽ trả lời cho bạn. Nếu bạn có thêm nữa, bạn chỉ có thể hỏi trong phần bình luận.

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