Code đọc file đến ký tự space trong file thì dừng lại

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 ạ !

Đọ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;
}
1 Like

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 …

Thường người ta dùng buffer bạn :slight_smile: 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.

2 Likes

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à :smile: , theo mình biết thì không có hàm đó, bạn có thể tự viết được mà :slight_smile:

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

std::string readFile(std::fstream &file)
{
    std::string line;
    std::string data;
    while(!file.eof())
    {
        std::getline(file, line);
        data += line;
    }
    return data;
}
2 Likes

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().

1 Like

đừ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
5 Likes

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

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