Mọi người cho e hỏi, dòng vào ra của C++ (inputstream, outputstream) và C (stdin, stdout) có gì khác nhau ?
_Stream và buffer có liên quan gì với nhau không? (em có đọc 1 câu trả lời trên quora là Stream như 1 dòng sông còn Buffer như 1 cái đập, khi Stream hết dữ liệu Buffer sẽ cung cấp dữ liệu … ) A/c giải thích giúp e rõ hơn với ạ!
_Buffer là 1 vùng nhớ trên RAM/DISK vậy Stream có phải là 1 vùng nhớ trên RAM như Buffer không hay là 1 khái niệm trừu tượng thôi ạ?
Khái niệm InputStream (OutputStream), stdin (stdout) và vùng nhớ Buffer?
Cái gì cũng nằm trên RAM hết. KHác ở chỗ, Stream dùng nhiu thì nó xài nhiu. Dùng tới đâu là data “chảy” tới dó ~> như dòng chảy, dòng chảy tiếng anh là Stream -> Stream. Vì dữ liệu đc load lần lượt ko phải 1 lần nên việc sử dụng RAM cũng rất nhẹ nhàng, thoải mái.
Buffer khác là đọc file cái bụp, toàn bộ nội dung được lưu trên RAM hết. Nên ưu điểm là chạy tới chạy lui nhanh, nhưng bù lại như đọc file 10GB thì úi giời <(") Nát RAM
Tùy cách implement mà stream và buffer được kết hợp với nhau. Cách bạn mô tả là khi stream của bạn có input và output với lượng dữ liệu không thống nhất, tức lúc thì đọc 10 bytes, lúc đọc 1 bytes chả biết sao mà lần -> chèn thêm cái buffer, gom đủ số bytes thì xã lũ 1 lần cho dễ xử lý :#
Cái đoạn bạn nói về buffer có vẻ không ổn lắm. Buffer không phải là đọc 1 phát hết file mà là đọc nhiều dữ liệu hơn so với yêu cầu vào RAM để giảm bớt việc phải truy cập lục lại từ bộ nhớ ngoài vốn chậm chạp hơn chứ không phải đọc hết file 1 lúc bạn nhé. Nhiều trường hợp file nhẹ và buffer lớn thì có thể là đọc hết nhưng không phải khi nào cũng thế.
Ngược lại với buffer đọc là buffer ghi là cho phép đợi đủ 1 lượng dữ liệu rồi mới ghi xuống bộ nhớ ngoài để ghi cùng 1 lượt cho nhanh hơn.
Buffer tích dữ liệu cho Stream chảy đều đặn hơn
Hỏi lại cho chắc: Vậy có trường hợp nào buffer đọc hết cả file không? Tại mình trc có đọc thì biết là vậy
Hỏi lại để update từ điển drgnz cho chắc cú hơn OvOb
Memory-mapped file là đọc hết file lưu vào Ram thì phải
Không Khi bạn đọc vào đúng slot mem được map thì sẽ gây page fault, page fault handler đá cái handler đọc từ file lên.
@907pqv Mô tả của @drgnz là chuẩn đó.
Mình bổ sung thêm về cách hiểu câu nói trích dẫn Stream có 3 loại là input, ouput và error.
“All input and output is performed with streams, which are sequences of bytes. In input operations, the bytes flow from a device (e.g., a keyboard, a disk drive, a network connection) to main memory. In output operations, bytes flow from main memory to a device (e.g., a display screen, a printer, a disk drive, a network connection, and so on).
When program execution begins, three streams are connected to the program automatically. Normally, the standard input stream is connected to the keyboard and the standard output stream is connected to the screen. Operating systems often allow these streams to be redirected to other devices. A third stream, the standard error stream, is connected to the screen.”
Hiểu như sau: dòng dữ liệu (gọi là stream) sẽ chảy từ thiết bị ngoại vi đầu vào như bàn phím, chuột tạo thành input stream. Dòng dữ liệu này được giữ lại tại vùng nhớ đệm giống như các con đập giữ nước lại. Khi có lệnh, lượng nước - dữ liệu này sẽ chảy để xuất ra các thiết bị khác như màn hinh, máy in thành dòng dữ liệu xuất ra - output stream. Tùy thuộc kết quả xả nước - xử lý dữ liệu, xả nước mất hoa màu của dân - error thì khiến dân bực có động thái - error stream hay là dòng dữ liệu thông báo lỗi, nhẹ thì văn bản khiển trách - error message nặng thì mất chính quyền - crash hệ thống.
sai ở chỗ này nè :V nó đọc 1 phần nhỏ ví dụ 4KB-8KB từ từ lên thôi chứ làm gì mới mở file lên đọc 1 ký tự mà nó load hết 10GB :V
stream là cách của chàng bựa Stroustrup bắt chước Unix hay Linux chuyển chuỗi thành stream gì đó :V còn buffer là cách tăng tốc stream thôi :V
ví dụ khi ghi ra màn hình, nếu ghi mỗi lần 1 ký tự sẽ rất chậm, nên ta tạo 1 cái buffer, ghi vào buffer đó từng ký tự 1, rồi khi nào ta thấy được thì ta đẩy nó ra màn hình 1 lượt mấy chục mấy trăm ký tự.
còn khi đọc từ đĩa cứng lên, nếu đọc từng ký tự một sẽ rất chậm, ta sẽ đọc 1 lượt ví dụ 4KB lên luôn, để vào 1 cái gọi là buffer, rồi đọc từng ký tự ở cái buffer 4KB đó ra, vậy lẹ hơn :V Giống như đi chợ mua cá, mua rau, mua thịt thì mua 1 lượt 3 món rồi để tủ lạnh, khi cần thì mở tủ lạnh ra, chứ ko ai khùng mà đi mua cá về nhà làm cá, rồi đi mua rau về rửa rau, rồi đi mua thịt về chặt thịt :V :V :V Tủ lạnh là cái buffer đó :V
Đợt tr m sài cái hàm memory map để tăng tốc đọc file mà nó báo lỗi memory leak tưởng nó đọc hết vào Ram :))
p/s:
https://vimentor.com/vi/lesson/memory-mapping-continue
Hình như nó có copy vào Ram hay sao đó chứ
Mình không quen với các ngôn ngữ khác, không biết nó có internal buffer không.
Nhưng với Rust, người dùng phải tự tạo buffer và đọc qua trait std::io::Read
, trong đó có 1 hàm read_to_end(reader, buffer)
sử dụng vector làm buffer. Như vậy, buffer có thể đọc hết cả file được mà nhỉ (tất nhiên là có reallocations)
Google-ing for C++
#include<iterator>
// ...
std::ifstream testFile("testfile", std::ios::binary);
std::vector<char> fileContents((std::istreambuf_iterator<char>(testFile)),
std::istreambuf_iterator<char>());
Cái này là đọc hết cả file vào vector<char>
rồi, vec char đó ko phải là buffer của testfile :v
Nếu đọc ví dụ từng dòng trong testfile, thì nội dung ở hdd ko đc load vào buffer của testfile 1 lượt, mà chỉ khoảng 4kb thôi. Vd testfile có 10000 dòng, 1mb tổng cộng, thì behind the scene nó đọc từ hdd lên 256 lần, còn trong code ta viết while(getline(testFile, line))
thì nhìn tưởng nó đọc từ hdd lên 10000 lần, thực tế nhờ buffer chỉ cần đọc hdd 256 lần thôi. Sau đó getline sẽ đọc từng dòng trong buffer này, nếu 1 dòng nằm trên 2 buffer thì nó phải chờ lâu hơn để fetch next buffer, còn nằm trong 1 buffer thì rất lẹ. Buffer là để tăng tốc cho stream :v
Có thể truy cập testfile buffer thông qua hàm rdbuf()
:v
Tìm document một hồi về rdbuf()
: Some derived stream classes (such as stringstream and fstream) maintain their own internal stream buffer , to which they are associated on construction. Calling this function to change the associated stream buffer shall have no effect on that internal stream buffer : the stream will have an associated stream buffer which is different from its internal stream buffer.
Yep, đã thông não. Buffer(dành cho file) là của OS, gọi là buffer cache. Không liên quan gì đến người dùng cả.