c++ - (C++) 从文本文件中读取数字

标签 c++ file digit

我有一个如下所示的文本文件:

73167176531330624919225119674426574742355349194934 96983520312774506326239578318016984801869478851843 85861560789112949495459501737958331952853208805511

等共20行。 我想要做的是从文本文件中读取每个数字并将它们放入一个整数数组(一个元素=一个数字)。我怎样才能从这个文本文件中只读取一个数字,而不是整行?

最佳答案

有多种方法可以实现您的目标,在本文中我将介绍三种不同的方法。他们三个都假设您使用 std::ifstream ifs ("filename.txt") 打开文件。并且您的“数组”实际上是一个声明为 std::vector<int> v 的 vector .

在这篇文章的结尾,还有一些关于如何加速插入 vector 的建议。


我想保持简单..

最简单的方法是阅读一个char一次使用 operator>>然后减去 '0'来自返回值。

标准保证'0'通过'9'是顺序的,并且由于 char只不过是一个以不同方式打印的数值,它可以隐式转换为 int .

char c;

while (ifs >> c)
  v.push_back (c - '0');

我喜欢 STL,讨厌写循环..

这将被许多人视为“c++ 方式来做到这一点”,特别是如果您正在与 STL 狂热者交谈,尽管它需要编写更多代码..

#include <algorithm>
#include <functional>
#include <iterator>

...

std::transform (
  std::istream_iterator<char> (ifs),
  std::istream_iterator<char> (), 
  std::back_inserter (v),
  std::bind2nd (std::minus<int> (), '0')
);

我不想写循环,但为什么不使用 lambda?

#include <algorithm>
#include <functional>
#include <iterator>

...

std::transform (
  std::istream_iterator<char> (iss),
  std::istream_iterator<char> (),
  std::back_inserter (v),
  [](char c){return c - '0';}
);

请问我std::vector每次插入时重新分配存储空间?

是的,可能吧。为了加快速度,您可以在开始进行任何插入之前在 vector 中保留存储空间,如下所示。

ifs.seekg (0, std::ios::end); // seek to the end of your file
v.reserve (ifs.tellg ()    ); // ifs.tellg () -> number of bytes in it
ifs.seekg (0, std::ios::beg); // seek back to the beginning

关于c++ - (C++) 从文本文件中读取数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11119429/

相关文章:

c - 分解一个数字 int 数组并获得每个数字的阶乘 - C 编程

c++ - 总数中的特定数字

c++ - 关于二进制数字的 int 数组

c++ - 来自 typedef 结构的错误

c++ - 如何定义模板函数重载以匹配空 std::tuple<>?

c++ - 我可以创建一个没有文件的句柄吗?

c++ - 链接共享 .h 文件的 2 个 cpp 文件

c++ - 在编译时计算迭代器返回类型

linux - 在多个 Shell 脚本中执行相同的命令

java - 如何在 Android 中检查/设置 mime 类型