如何从随机访问文件中搜索和显示内容?

Posted

技术标签:

【中文标题】如何从随机访问文件中搜索和显示内容?【英文标题】:How to search and display content from a random access file? 【发布时间】:2013-11-11 03:43:20 【问题描述】:

此代码应该在文件中搜索每个客户端的 iterNo,然后显示该信息。我的问题是,无论我搜索什么数字,它总是显示文件中的第一项。任何帮助将不胜感激。现在真的很绝望......提前感谢您的回复。

void View()
       
    char ans; //answer to store 'y' or 'n'
    Intervention inte;
    int interNo;

    ifstream InfoFile("info.dat", ios::in |ios::binary|ios::app);
    if (!InfoFile)
    
        cout <<"Error - random files could not be opened.";
    
    else
    
        while (true)
        
            cout << "\nEnter client's interNo number to display ";

            cin >> interNo;

            inte.getClient();
            inte.getAddress();
            inte.getTelNo();
            inte.getTime();
            inte.getDate();
            inte.getAnimal();

            //InfoFile.seekg(sizeof(Intervention)*(interNo - 1));
            InfoFile.read(reinterpret_cast<char *> (&inte), sizeof(Intervention));
            //if not eof show data
            if (!InfoFile.eof())
            
                //Display the processed
                // info for the employee
                inte.display();
            
            cout << "Enter another employee's information to display ? [y / n] ";
            fflush(stdin);
            ans = ' ';
            while (ans != 'y' && ans != 'Y' &&
                ans != 'n' && ans != 'N')
            
                ans = _getch();
             cout << endl;
            if (ans == 'n' || ans == 'N')
            
                exit(1);
            

        //end while

    //end else

//end function view
//**********************************************

【问题讨论】:

你没有做任何搜索;您只是使用read 从文件中读取第一个值。 (你注释掉了上面的行,它确实移动了文件指针。)如果你想定位一个特定的客户端,你必须从文件的开头实际移动文件指针。 真相是我不知道把那条线放在哪里......如果我把它放在 (if (!InfoFile.eof())) 之外的任何地方......那么它就直接到问我是否要显示另一个而不显示任何内容 【参考方案1】:

代码做了它应该做的事情。如果找到的干预是您要查找的干预,您不会检查任何地方,也不会移动文件读取指针。

如果您将 ID 存储在文件中

你也只读过一次干预:

InfoFile.read(reinterpret_cast<char *> (&inte), sizeof(Intervention));

也许你的意思是检查干预是否有你输入的 ID?

while(inte.getID()!=interNo && InfoFile)
  InfoFile.read(reinterpret_cast<char *> (&inte), sizeof(Intervention));

如果你不这样做

您需要取消对之前必须注释掉的代码行的注释:

InfoFile.seekg(sizeof(Intervention)*(interNo - 1));

这一行实际上应该将read pointer 定位到文件中写入给定Intervention 的位置。查看C++ reference 页面了解有关读取指针的更多详细信息。

【讨论】:

我引用了您应该替换的行。将第一个 sn-p 中的代码替换为第二个 sn-p 中的代码。 我遇到了另一个问题..当我输入我正在搜索的数字时,它仍然显示第一个项目,但如果我选择是并尝试显示另一个项目,文件中的第二个项目显示..如果我再次选择是来显示另一个,它会显示我输入的号码的信息 我想我误解了文件本身背后的概念。如果您将 ID 存储在文件中,我的解决方案将有效,但您可能。我并没有真正看你评论的行。请稍后再检查我的主要答案。 我没有使用你的 getID,而是使用了 getInterventionNo,因为我的程序中没有 getID 感谢您的帮助,但即使取消注释该行,它仍然没有显示正确的信息

以上是关于如何从随机访问文件中搜索和显示内容?的主要内容,如果未能解决你的问题,请参考以下文章

Python 随机访问文件

如何从内容处置中获取文件名

如何使用JS随机更改HTML内容

win10系统,Everything软件能否搜索文件里面指定的内容,如可以要如何设置?

如何从应用程序显示模板访问 Web 内容结构模板

Jmeter中随机读取测试文件的内容