Cách kiểm soát bộ đệm và dùng getline đúng trong C++

Xin chào mọi người. Đã lâu mình không thăm diễn đàn nên lỡ bài viết của mình có gì không đúng với nội quy thì mong mọi người nhắc nhở ạ ^^
Mình hay gặp trục trặc về vấn đề nhập xâu có khoảng cách nên mình muốn hỏi kỹ càng về cách hoạt động của các hàm liên quan như fflush(), cin.ignore()getline().
Mình có 1 đoạn chương trình sau:

#include <bits/stdc++.h>

using namespace std;

int main()
{
    freopen("input", "r", stdin);
    int x;
    cin >> x;
    cout << x << '\n';
    for(int i = 1; i <= 3; ++i) {
        string s;
        getline(cin, s);
        istringstream iss(s);
        while(iss >> x) cout << x << ' ';
        cout << '\n';
    }
    return 0;
}

file input

1
1 2
1 2 3
1 2 3 4

Mục đích là với từng dòng mình tách thành các số nguyên và in ra lại file input.
Mình đã tìm hiểu cơ chế và hiểu nếu đặt cin.ignore(1) trước vòng for sẽ bỏ được ký tự \n trong buffer trước đó. Mình thử dùng fflush(stdin) thì kết quả chỉ in ra số đầu tiên mặc dù mình tìm hiểu thì fflush() có chức năng xóa bộ đệm như việc bỏ qua ký tự của cin.ignore(). Vậy nên mình muốn hỏi trong trường hợp này vì sao fflush() không hoạt động như mong muốn và nếu mình dùng sai thì phải sửa lại như thế nào ạ?

Mình xin cảm ơn.

Đơn giản là bạn hãy quên fflush(stdin) đi
http://devnt.org/hay-dung-viec-su-dung-fflushstdin-de-xoa-dong-nhap/

9 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?