从文件中读取第n个元素

时间:2015-11-30 17:17:23

标签: c++

我有一个包含一列数字的文本文件。列中有大约500个数字。我怎么才读第n个数字。例如,有没有办法在列中读取和存储第49个数字?

4 个答案:

答案 0 :(得分:1)

如果数字是固定大小(您没有显示示例文件),那么您可以寻找大小* n并阅读。否则只需执行读取,解析,计数循环,直到达到n

答案 1 :(得分:1)

如果它们被存储为文本,那么每个数字所占用的空间可能会有所不同,您只需阅读它们,直到找到正确的点,或者使用等级间接 - 即创建数据本身的索引。

对于前者,您可以(例如)将每个数字存储为32位二进制数。在一个典型的机器上,这意味着每个数字占用4个字节,所以进入N th 项,你将N乘以4,寻找文件中的那个点,并读取4个字节。

如果你想将这些数字存储为文本,但仍然支持这样的搜索,你可以用空格填充每个数字,这样它们仍然占用文件中相同的空间(例如,每个数字10个字符)

如果你真的想避免这种情况(或者有预先定义的格式以便你不能这样做),那么你可以在文件中创建一个索引。这主要是在/如果您可以证明读取整个文件并存储每行开头位置的成本时。至少有两个明显的理由。一个是索引可以与使用分开,例如在晚上批量构建索引以优化白天对数据的使用。另一种可能性就是你使用数据文件足以使得能够寻找特定点的节省超过索引文件一次的时间。

虽然也有不那么明显的理由 - 例如,您可能需要满足一些(至少是软的)实时约束,如果您通读文件来查找每个项目,您可能无法满足这些约束 - 特别是,您可以处理的文件大小可能受到实时约束的限制。在这种情况下,索引可能是绝对必要的,以满足您的要求,而不仅仅是优化。

答案 2 :(得分:1)

为@ pm100的答案添加详细程度(可能不必要),固定大小意味着相同的ascii计数。

001
01

001占用3个字节,而01只占用2个字节。 因此,如果您的文件的数字格式如下:

1
2
3
100
10

使用lseek(或fseek)只有在每个列条目具有相同数量的每个行的ASCII字符时才会起作用(据我所知)。 如果你也走这条路线,你还需要跟踪\n字符。 lseek(fd, size * n * 2);

答案 3 :(得分:0)

你可以这样做:

ifstream fin("example.txt");
std::string line;

for(size_t i = 0; i < n; ++i) {
  std::getline(fin, line);
}
// line contains line n;