c++ — Đọc từng dòng tệp bằng cách sử dụng ifstream trong C++

Đọc một dòng tệp theo dòng trong C + + hoàn toàn có thể được thực thi theo một số ít cách khác nhau .

[Nhanh] Lặp lại với std :: getline ()

Cách tiếp cận đơn thuần nhất là mở std :: ifstream và loop bằng những lệnh gọi std :: getline ( ). Mã sạch và dễ hiểu .

#include 

std::ifstream file(FILENAME);
if (file.is_open()) {
    std::string line;
    while (getline(file, line)) {
        // using printf() in all tests for consistency
        printf("%s", line.c_str());
    }
    file.close();
}

[Nhanh] Sử dụng tệp_descrip_source của Boost

Một năng lực khác là sử dụng thư viện Boost, nhưng mã sẽ dài dòng hơn một chút ít. Hiệu suất khá giống với mã ở trên ( Lặp lại với std :: getline ( ) ) .

#include 
#include 
#include 

namespace io = boost::iostreams;

void readLineByLineBoost() {
    int fdr = open(FILENAME, O_RDONLY);
    if (fdr >= 0) {
        io::file_descriptor_source fdDevice(fdr, io::file_descriptor_flags::close_handle);
        io::stream  in(fdDevice);
        if (fdDevice.is_open()) {
            std::string line;
            while (std::getline(in, line)) {
                // using printf() in all tests for consistency
                printf("%s", line.c_str());
            }
            fdDevice.close();
        }
    }
}

[Nhanh nhất] Sử dụng mã C

Nếu hiệu suất là quan trọng đối với phần mềm của bạn, bạn có thể xem xét sử dụng ngôn ngữ C. Mã này có thể nhanh hơn 4-5 lần so với các phiên bản C++ ở trên, xem điểm chuẩn bên dưới

FILE* fp = fopen(FILENAME, "r");
if (fp == NULL)
    exit(EXIT_FAILURE);

char* line = NULL;
size_t len = 0;
while ((getline(&line, &len, fp)) != -1) {
    // using printf() in all tests for consistency
    printf("%s", line);
}
fclose(fp);
if (line)
    free(line);

Điểm chuẩn – Cái nào nhanh hơn?

Tôi đã thực hiện một số điểm chuẩn hiệu suất với mã ở trên và kết quả rất thú vị. Tôi đã kiểm tra mã với các tệp ASCII có chứa 100.000 dòng, 1.000.000 dòng và 10.000.000 dòng văn bản. Mỗi dòng văn bản chứa trung bình 10 từ. Chương trình được biên dịch với tối ưu hóa -O3 và đầu ra của nó được chuyển tiếp tới /dev/null để loại bỏ biến thời gian ghi nhật ký khỏi phép đo. Cuối cùng, nhưng không kém phần quan trọng, mỗi đoạn mã ghi lại từng dòng với hàm printf() để thống nhất.

Kết quả cho thấy thời hạn ( tính bằng ms ) mà mỗi đoạn mã đã dùng để đọc những tệp .Sự độc lạ về hiệu năng giữa hai cách tiếp cận C + + là tối thiểu và không nên tạo ra bất kể sự độc lạ nào trong thực tiễn. Hiệu suất của mã C là những gì làm cho điểm chuẩn ấn tượng và hoàn toàn có thể là một đổi khác game show về vận tốc .

                             10K lines     100K lines     1000K lines
Loop with std::getline()         105ms          894ms          9773ms
Boost code                       106ms          968ms          9561ms
C code                            23ms          243ms          2397ms

 enter image description here