[Wiki] Đọc file từng dòng mà không cần biết chiều dài của dòng trong C

Nguyên tắc thực hiện là sẽ đọc từng ký tự một, cho tới khi gặp xuống hàng \n hoặc EOF.

int eof_or_line_break(char c) // Kiểm tra xuống hàng hoặc EOF
{
    return (c == '\n' || c == EOF);
}

// cho phép nhập vào max_len để đề phòng lỗi khi dòng quá dài, vượt qua kích thước chuỗi
int readline(char * line, int max_len, FILE *fp)
{
    char c;
    int i = 0;
    // nếu không phải eof_or_line_break hoặc quá dài
    while( !eof_or_line_break(c = fgetc(fp)) && i < max_len - 1) 
        line[i++] = c;
    line[i] = 0; // kết thúc chuỗi

    if (i == max_len - 1) // neu line dai hon max_len
        while( (c = fgetc(fp)) != '\n') // bo het doan phia sau
            ;

    return i; // số byte đã đọc, không tính kết thúc chuỗi
}

Cách sử dụng

#define MAX_LEN 10
FILE * fp = fopen("input","r");
char line[MAX_LEN];

readline(line, MAX_LEN, fp);
7 Likes
#include <fstream>
#include <streambuf>

std::ifstream t("file.txt");
std::string str;

t.seekg(0, std::ios::end);   
str.reserve(t.tellg());
t.seekg(0, std::ios::beg);

str.assign((std::istreambuf_iterator<char>(t)),
            std::istreambuf_iterator<char>());

Đọc nguyên file vào string luôn, ngại gì vết bẩn :smiley:

Nguồn:


2 Likes

Cái này C mà. Nhưng mà cũng có cách đọc hết toàn bộ vào char, dùng realloc để cấp vùng nhớ nếu thiếu :smile:

1 Like

Giải thích cho e từng dòng trog code đc ko anh ?
E ms hc C nên nhìn rối quá k hiểu :v:

Thay vì hỏi như vậy thì mình sẽ rất vui nếu bạn hỏi rằng: :slight_smile:

Anh ơi, ở dòng m, dòng n và dòng p em không hiểu nó nghĩa là gì, anh giải thích giúp em được không.

2 Likes

E k hiểu nghĩa của từng dòng này

Chuỗi phải kết thúc bằng byte 00 nên n char chỉ có n-1 kí tự thôi.

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