我是靠谱客的博主 无辜秋天,最近开发中收集的这篇文章主要介绍C/C++ 获取文件中有效行的数量,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

几种获取文件有多少行的方法

使用C++中的ifstream 与 getline函数搭配使用 如:
    std::string file_name = "F:\phone_num_10000000.txt";
    std::ifstream ifs(file_name.c_str());
    int line_count = 0;     ///记录文件中行的数量
    std::string tmp_content; ///临时保存行数据
    while (!ifs.eof())
    {
        std::getline(ifs, tmp_content, 'n');
        ///过滤空行
        line_count += !tmp_content.empty();
    }
    std::cout << "line_count = " << line_count << std::endl;  

以上想法是最先想到的,运行上面的程序,使用clock()函数计数,处理10000000行条数据大概用了3500左右的CPU时钟周期
经过每条语句的跟着,发现时间基本上全用在调用std::getline函数用了上了。出现这种原因,是频繁的IO操作,而IO操作都很昂贵。

针对上面的原因,时间主要用在IO操作上,我们可以减少IO操作,以达到提供性能,改进的方法代码如下:
    std::string file_name = "F:\phone_num_10000000.txt";
    struct stat s;
    stat(file_name.c_str(), &s);
    ///获取指定文本的行数
    std::string file_buf(s.st_size + 1, '');
    ///将文件中的数据一次性读出来
    std::ifstream ifs(file_name.c_str());
    ifs.read(&file_buf[0],   file_buf.size()  );
    int line_count = 0; ///记录文件中行的数量
    const char* file_buf_tmp = file_buf.c_str(); ///获取文件内容指针
    while (*file_buf_tmp != '')
    {
        ///查找第一个换行
        const char* p = strchr(file_buf_tmp, 'n');
        if (p == NULL)
        {
            ///最后一行没有'n'
            ++line_count;
            break;
        }
        ///过滤空行
        line_count += p - file_buf_tmp > 0;
        ///查找下一个'n'
        file_buf_tmp += p - file_buf_tmp + 1;
    }
    std::cout << "line_count = " << line_count << std::endl;  
经过下面改进的代码,测试中时间缩短到800左右的CPU时钟周期,单独测试上面那个while循环,只是用了200左右的时钟周期,也就是说读文件到缓存用了将近
600左右时钟周期,逻辑处理性能已经很好了, 那还能不能优化IO操作性能呢,我们尝试着将C++读取文件修改C语言读取文件试试,具体代码如下:
    std::string file_name = "F:\phone_num_10000000.txt";
    struct stat s;
    stat(file_name.c_str(), &s);
    ///获取指定文本的行数
    std::string file_buf(s.st_size + 1, '');
    ///将文件中的数据一次性读出来
    FILE* fp = fopen(file_name.c_str(), "rb");
    fread(&file_buf[0], sizeof(char), file_buf.size(), fp);
    int line_count = 0; ///记录文件中行的数量
    const char* file_buf_tmp = file_buf.c_str(); ///获取文件内容指针
    while (*file_buf_tmp != '')
    {
        ///查找第一个换行
        const char* p = strchr(file_buf_tmp, 'n');
        if (p == NULL)
        {
            ///最后一行没有'n'
            ++line_count;
            break;
        }
        ///过滤空行
        line_count += p - file_buf_tmp > 0;
        ///查找下一个'n'
        file_buf_tmp += p - file_buf_tmp + 1;
    }
    std::cout << "line_count = " << line_count << std::endl;  
经过测试,目前处理只需要500左右的时间周期,改用C语言读取文件比起C++读取数据性能提高了将近一半。


最后

以上就是无辜秋天为你收集整理的C/C++ 获取文件中有效行的数量的全部内容,希望文章能够帮你解决C/C++ 获取文件中有效行的数量所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部