文本文件二进制搜索

时间:2015-11-25 21:19:27

标签: c++ search fstream seekg

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

.state('dashboard', {
    parent: 'baseState'
    url: '/dashboard',
    templateUrl: 'partials/dashboard.html',
    controller: 'DashboardController',
    ...
})

代码如下:

Ampersand           Gregorina           5465874526370945
Anderson            Bob                 4235838387422002
Anderson            Petunia             4235473838457294
Aphid               Bumbellina          8392489357392473
Armstrong-Jones     Mike                8238742438632892

我能够检索列表中除第一条记录外的所有记录。似乎seekg正在寻找正确的位置,但cardNumbers没有读取正确的信息。当'中间''设置为0,seekg应该寻找第0行,(中间* 57),读入Ampersand Gregorina并进行比较。相反,它仍在阅读安德森鲍勃。

关于为什么会发生这种情况的任何想法?

由于

2 个答案:

答案 0 :(得分:0)

LineNumbers正在被循环修改,从4到1,再到-1。 -1会使​​你的循环太早终止,所以你不能正确地拿起第一个条目。

这似乎是一个家庭作业问题,所以我希望你可以用它来引导自己找到答案。

答案 1 :(得分:0)

使用seekg等功能时,最好以binary mode打开文件,而不是文本模式,因为您的代码现在正在执行。换句话说,你应该这样做:

cardNumbers.open(fileName, std::ios::in | std::ios::binary);

原因是在文本模式下打开文件将允许完成行尾翻译。这会使seekgtellg等函数在不稳定(或幸运工作)之间产生最佳效果,在最坏的情况下,对文本处理无用。

当以二进制模式打开文件时,seekg和其他系列函数按预期工作,因为没有完成行尾转换。实际上,您将在您指定的文件中寻找字节偏移量,而不会被行尾翻译抛弃。

此外,执行此操作后,行中数据的长度不仅包括可见文本,还包括构成行尾序列的不可见字符。因此,在二进制模式下,57的手计算不正确 - 它应该是58或59,具体取决于您是分别使用Linux / Unix还是Windows。