01/10/2018, 01:14

Mọi người cho mình hỏi về hàm (ifstream) trong c++

tại sao mình đọc đến ký tự space trong file thì nó lại dừng lại
ví dụ: ifstream file; string s;
file >> s;
thanks trước ạ !

Phạm Minh Anh Hữu viết 03:28 ngày 01/10/2018

Đọc một dòng:

std::string data;
std::getline(file, data);

Đọc từng kí tự rồi đưa vào chuỗi:

char c;
std::string data;
while(!file.eof())
{
    file.get(c);
    data += c;
}

Hay đọc từng dòng rồi đưa vào chuỗi:

std::string line;
std::string data;
while(!file.eof())
{
    std::getline(file, line);
    data += line;
}
Hoang viết 03:21 ngày 01/10/2018

anh ơi vậy có hàm nào đọc cả file luôn không ???
hay chỉ có đọc từng dòng or từng chữ cái thôi …

rogp10 viết 03:27 ngày 01/10/2018

Thường người ta dùng buffer bạn chứ ko đọc cả file vào 1 lúc. Với lại kích cỡ file đó tính bằng GB thì thua do đọc xong ghi lại lâu lắm, nếu chuyển qua đọc binary và bạn có cấu trúc file thì bạn thao tác raw được trên từng byte.

Phạm Minh Anh Hữu viết 03:29 ngày 01/10/2018

Thì bạn đọc từng dòng hoặc từng kí tự thì dần dần sẽ đọc hết file mà , theo mình biết thì không có hàm đó, bạn có thể tự viết được mà

Đọc được file dung lượng nhỏ thôi bạn

std::string readFile(std::fstream &file)
{
    std::string line;
    std::string data;
    while(!file.eof())
    {
        std::getline(file, line);
        data += line;
    }
    return data;
}
Người bí ẩn viết 03:29 ngày 01/10/2018

Cái dòng file >> s; nó giống như hàm scanf hay std::cin đó, không thể đọc được ký tự khoảng trắng, phải dùng hàm gets hay std::getline().

viết 03:18 ngày 01/10/2018

đừng xài eof(). std::getline trả về chính stream mà nó đọc, mà stream này có thể hiểu là bool, false đồng nghĩa với hết đọc stream đó được.

std::ifstream fin("file.txt");
for (std::string line; std::getline(fin, line); ) //line là biến tạm thời, bỏ nó vào for để hạn chế phạm vi của nó
{
    //làm gì đó với line
}

đọc từng từ, xử lý từng từ:

std::ifstream fin("file.txt");
for (std::string word; fin >> word; )
{
    //làm gì đó với word
}

đọc từng ký tự, xử lý từng ký tự

std::ifstream fin("file.txt");
for (char c; fin >> c; )
{
    //làm gì đó với c
}

còn muốn đọc hết nội dung của 1 file thì cũng đọc từ từ từng ký tự một, nhưng đừng xài operator+= của string chậm lắm. Có cách xài istreambuf_iterator:

std::ifstream fin("file.txt");
std::string content( (std::istreambuf_iterator<char>(fin)),
                     (std::istreambuf_iterator<char>()   ) );

std::string content{std::istreambuf_iterator<char>{fin}, {}}; //C++14 gọn hơn
Phạm Minh Anh Hữu viết 03:21 ngày 01/10/2018

Cảm ơn anh đã chỉ giáo

Bài liên quan
0