c 语言读取文件一行,使用C ++中的ifstream逐行读取文件

在C ++中逐行读取文件可以通过某些不同的方式完成。

[快]循环使用std :: getline()

最简单的方法是使用std :: getline()调用打开std :: ifstream和循环。代码简洁易懂。#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();}

[Fast]使用Boost的file_description_source

另一种可能性是使用Boost库,但代码更加冗长。性能与上面的代码非常相似(Loop with 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 <:file_descriptor_source> 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();

}

}}

[最快]使用C代码

如果性能对您的软件至关重要,您可以考虑使用C语言。此代码可以比上面的C ++版本快4-5倍,请参阅下面的基准测试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);

基准 - 哪一个更快?

我已经使用上面的代码完成了一些性能基准测试,结果很有趣。我已经使用包含100,000行,1,000,000行和10,000,000行文本的ASCII文件测试了代码。每行文本平均包含10个单词。程序通过-O3优化进行编译,并将其输出转发到/dev/null,以便从测量中删除记录时间变量。最后,但并非最不重要的是,每段代码都会记录每行的printf()功能以保持一致性。

结果显示每段代码读取文件所用的时间(以毫秒为单位)。

两种C ++方法之间的性能差异很小,在实践中不应有任何区别。C代码的性能使得基准测试令人印象深刻,并且在速度方面可以改变游戏规则。

10K lines     100K lines     1000K lines

Loop with std::getline()         105ms          894ms          9773ms

Boost code                       106ms          968ms          9561ms

C code                            23ms          243ms          2397ms

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值