c++ seekg() 读取特定数字

标签 c++

我有一个文本文件:

1 2 3 4 5 6 7 8 9 

我想用seekg()读取一个特定的数字

ifstream fr("duomenys.txt");
fr.seekg(2,ios::beg);
int n;
fr >> n;
cout << n;

如果我将位置设置为 1、2 或 3,读取的数字是正确的,但使用其他位置,它返回更早的数字,例如位置 3 和 4 都返回 3,位置 5 和 6 都返回 4。如果我'是的,这是因为数字之间的空格而发生的,但我不明白,为什么如果位置是 3,它返回数字 3,而不是预期的 2,因为 2 和 3 之间的空格?还有一个问题,我应该如何实现我的功能,我可以使用他的位置从文件中获取特定数字?我正在尝试像文件中的数组那样做,例如,A[i] 从索引 i 处的数组返回项目,因此我的函数 (i) 应该从文件中返回索引 i 处的项目。

最佳答案

简单的回答是你不能。在文本文件中, seekg 的参数必须是从先前的返回值 tellg,除了少数异常(exception),您可以搜索到 文件的开头或结尾。寻求位置 5,对于 例如,没有任何意义。

如果你用二进制打开文件,你可以多做一点, 但搜索位置仍将以字节为单位;你必须知道 每个数字在文件中的确切位置。在文件中 你已经提出,位置将是 0、2、4 ......等等。但是 这假设每个数字正好是一个数字,并且正好是一个空格 将它们分开,这可能不现实。

对于像您这样的小型数据集(至少在示例中), 显而易见的解决方案就是将所有数据读入 std::vector,并对其进行索引。对于非常大的数据集: 该文件必须明确写入以支持读取,在 二进制模式,每个数字有固定数量的字符 (包括任何分隔符)。然后你可以寻找 i * n, 其中 i 是你想要的位置,n 是字符数 每个数字。但同样,仅在二进制模式下,读取和 写作。

关于c++ seekg() 读取特定数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26482041/

相关文章:

c++ - 使用 typeid 获取派生类的名称

c++ - 从全局对象的构造函数调用std::ofstream不会创建文件

c++ - 矩阵迭代的逐位移位?

c++ - 在 windows.h 中使用 CreateWindow 单击按钮后尝试返回 char*/string

c++ - 编译时指针 "does not have a type"?

c++ - 在 rapidjson 中使用 AddMember 获取空值

c++ - 为什么在这样的递归代码中避免内存分配/解除分配并不能节省运行时间?

c++ - 运算符重载 C 结构

c++ - 从 init.d 脚本启动时程序无法打开文件

c++ - 所有变量是否都根据它们在程序中声明的顺序连续存储?