我有一个如下所示的文本文件:
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? c++11
#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/