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::in
và std::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
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::in
và ios_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 và đầ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 và đầ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.