草庐IT

使用 BinarySearch 算法的 C++ 函数(.bin 文件)

coder 2024-02-25 原文

我必须创建一个函数来检查特定单词是否存在于 .bin 文件中。我想使用二进制搜索算法。问题是,我必须从 .bin 文件中读取,所以我感到困惑(因为没有行,对吧?)。功能对我不起作用。它说“特定词”(由用户输入)不存在,即使它确实存在。 任何帮助都会很好。

#include <iostream>
#include <string>
#include <fstream>
#include <cstring>
#include <algorithm>

using namespace std;
const int buffer_size = 30;

void Create_Bin_File ()
{
ifstream fin ("example.txt");  
ofstream fout ("Binary.bin", ios::binary); 
const unsigned int RECORD_SIZE = 30; // was BUFFER_SIZE
char buffer[RECORD_SIZE] = {0}; // zero init buffer

while (fin.getline (buffer, RECORD_SIZE))
{
fout.write (buffer, RECORD_SIZE);
// refill buffer with zeroes for next time round
fill_n (buffer, RECORD_SIZE, 0);
}
fin.close ();
fout.close ();
}

void Binary_Search (const string& filename, string SearchVal)
{
ifstream file (filename.c_str(), ios::binary);
if (file.is_open())
{
    cout << "The file is opened"<< endl;
    cout << "\n";
}
else
{
    cout << "Error opening file"<< endl;
    cout << "\n";
    return; // no point continuing Binary_Search() if file failed to open!
}
const unsigned int RECORD_SIZE = 30; // was BUFFER_SIZE
char buffer[RECORD_SIZE] = {0}; // zero init buffer
int recordCount  =  0;
int recordWanted = -1;
while (file.read(buffer, RECORD_SIZE))
{
    if(SearchVal == buffer)
    {

        recordWanted = recordCount;
        // if this was just a naive search loop could bail out now...
    }
    cout << recordCount << " : " << buffer << "\n";

    // refill buffer with zeroes for next time round
    fill_n (buffer, RECORD_SIZE, 0);
    ++recordCount;
}

cout << "\n";
cout << "file contains " << recordCount << " records\n";
cout << "\n";
if (recordWanted == -1)

    cout << "record wanted could not be found\n";
else

    cout << "record wanted is at index " << recordWanted << " records\n";
cout << "\n";
} 




int main()
{

Create_Bin_File();  
string word;
cout << "Enter word, that you want to find in a file: " << endl;
cin >> word;

Binary_Search("Binary.bin", word);


return 0;
}

任务: 》用C++写一个程序,如果程序是用文件工作的,就不要把文件的全部内容复制到操作内存中。文件部分是指固定长度的记录。 H7。编写一个程序,将所有标准 C++ 保留字放入有序表中(据我所知,有序表意味着这些词按字母顺序排列)。编写一个函数,该函数使用二进制搜索检查输入字符串(长度 30)是否为 C++ 保留字。表应作为直接访问文件。 C++ 保留程序应从文本文件中读取。”


关于 BinarySearch 函数的 grek40 解决方案:

所以我做了记录功能:

std::string GetRecord(std::ifstream& inFile, int pos)
{
char buffer[RECORD_SIZE];
// clear possible flags like EOF, before moving the read position
inFile.clear();
// set the file read position to the requested record position
inFile.seekg(pos * RECORD_SIZE, std::ios::beg);
inFile.read(buffer, RECORD_SIZE);
// note: automatic conversion from char[] to std::string
return buffer;
}

和二进制搜索功能:(已解决 - 工作!)

void Binary_Search (const string& filename, string SearchVal)
{
ifstream file (filename.c_str(), ios::binary);
if (file.is_open())
{
cout << "The file is opened"<< endl;
cout << "\n";
}
else
{
cout << "Error opening file"<< endl;
cout << "\n";
return; // no point continuing Binary_Search() if file failed to open!
}
int pos = 0;
int lowerLimit = 0;
int recordCount = 73; // Calculated before[I'll change this part, when I get      this function working]
                  // At this point, there's exactly 73 records in .bin file
 char buffer[RECORD_SIZE] = {0}; // zero init buffer (while loop will overwrite with record values)
 int upperLimit = recordCount;
 while ( (lowerLimit < upperLimit) ) // Searching as long as it doesn't find it
 {
    pos = (lowerLimit + upperLimit) / 2;
    std::string buffer = GetRecord(file, pos);

    if (buffer == SearchVal)
    {
        cout << "Found!";
        lowerLimit = 1; // For stopping (If found!)
        upperLimit = 0; // For stopping
    }
    else if (SearchVal > buffer)
    {
        lowerLimit = pos + 1;
    }
    else if (SearchVal < buffer)
    {
     upperLimit = pos;
    }

}
}

最佳答案

据我所知,您有一个解决方案,您可以将所有给定的单词从文本文件移动到二进制文件,并且您可以在二进制文件中找到单词(如果它们存在)。

我假设您创建了二进制文件,其中包含等长 (30) 的已排序记录,其中每条记录的文本部分以零结尾。

现在,让我们创建一个函数,它接受一个打开的二进制文件流和一个记录位置,并返回该记录位置的字符串:

std::string GetRecord(std::ifstream& inFile, int pos)
{
    char buffer[RECORD_SIZE];
    // clear possible flags like EOF, before moving the read position
    inFile.clear();
    // set the file read position to the requested record position
    inFile.seekg(pos * RECORD_SIZE, std::ios::beg);
    inFile.read(buffer, RECORD_SIZE);
    // note: automatic conversion from char[] to std::string
    return buffer;
}

对于二分搜索,你应该为你的搜索位置定义一个上限和下限。注意上限是lastItemPosition + 1 , 所以你实际上永远不会访问基于零的索引中的这个位置。

int lowerLimit = 0;
int upperLimit = recordCount; // count when reading the lines in .txt

您需要搜索一个结果,只要您没有找到它并且 lowerLimit < upperLimit .

您的下一个搜索词是 position = (lowerLimit + upperLimit) / 2; .

将单词与您的搜索文本进行比较。关于平等,你完成了。

如果单词小于搜索文本,您的结果位置可能会比您刚刚查看的索引更高。所以你需要调整lowerLimit = position + 1

如果单词大于搜索文本,您的结果位置可能会比您刚刚查看的索引更低upperLimit = position

您按照说明使用调整后的上限和下限重复搜索。

关于使用 BinarySearch 算法的 C++ 函数(.bin 文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37113577/

有关使用 BinarySearch 算法的 C++ 函数(.bin 文件)的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  5. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  6. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  7. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  8. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  9. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  10. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

随机推荐