【问题标题】:How to avoid atoi when read a file读取文件时如何避免atoi
【发布时间】:2016-11-22 19:12:21
【问题描述】:

我在一个文件上写了一些信息,尤其是 unsigned int。 后来另一个程序去读取这些信息。 问题是第二个程序非常慢。 我分析它,它花费 50% 的时间来做 atoi。

有没有办法在文件上写入 unsigned int 以避免 atoi (二进制?序列化?)

Ps:我使用 mmap 进行读取

编辑:

我看到您的回复,最好的解决方案是将 int 的二进制内容放入文件中

【问题讨论】:

  • 尝试使用 fstream 读取格式化输入?
  • 您是否通过将数据读入固定缓冲区来最小化内存分配?
  • 您确实可以写入(和读取)unsigned int 的二进制表示。
  • 向我们展示缓慢的代码。您拨打atoi 的频率可能超出了您的实际需要,或者做了一些糟糕的事情。

标签: c++ string file c++11 serialization


【解决方案1】:

我会看看strtoul()。 与 atoi() 相比,它还具有提供错误处理的优势。

【讨论】:

    【解决方案2】:

    atoi() 仍然比使用字符串流更快。但是,使用字符串流来执行此操作是在 C++ 中实现类型安全和标准的唯一方法。

    实现类型安全和标准化的最佳方法是使用 Boost 库的约定来实现,同时比字符串流或 atoi() 或 strtoul() 之类的东西更快。

    Boost lexical_cast 快速且类型安全。

    编辑:2016 年 7 月 19 日下午 2:07

    在您的情况下,如果您以二进制模式编写文件,则可以完全跳过此步骤。真正回归基本的东西,比如......

     ofstream fout;
     fout.open("example.bin", ios::binary | ios::out | ios::trunc);
    
     unsigned int int_out;
     for(int i=0; i< someArray.length; ++i) {
     int_out = someArray[i];
     fout.write((char*)&int_out, sizeof(unsigned int));
     }
    

    然后您可以在另一端以几乎相同的方式阅读它。但是使用...

     ifstream fin;
     fin.open("example.bin", ios::binary);
    
     unsigned int int_in;
     for(int i=0; i< someArray.length; ++i) {
     fout.read((char*)&int_in, sizeof(unsigned int));
     someArray[i] = int_in;
     }
    

    【讨论】:

    • 我不能使用字符串 streans 我对所有文件都有一个长字符 *(文件是 mmap),除了将 insigned int 写入二进制 add 来获得它之外,您还有其他解决方案吗演员表?
    • 好的,我用另一种方式编辑了它,以二进制形式进行。
    猜你喜欢
    • 1970-01-01
    • 2011-06-06
    • 2010-10-07
    • 2020-11-12
    • 2013-03-24
    • 2014-08-22
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多