我应该在具有固定长度记录和字段的数据文件中读取,在内存中创建排序索引列表,并将该列表保存到文件中。然后我要编写第二个程序,以交互方式(通过Linux命令行)获取密钥和索引文件名,打开并加载索引文件,使用索引表搜索给定的密钥,然后打开并返回正确的数据记录。
原始文件包含一个带有键(int)的记录列表,一个名称(最多8个字符的字符串),一个代码(int)和一个cost(double)。
RRN(相对记录号)从1开始,RRN为0表示只有第一个条目大小的虚拟记录。
这是我将要使用的数据文件。
8 blank 0 0.0
12345 Item06 45 14.2
12434 Item04 21 17.3
12382 Item09 62 41.37
34186 Item25 18 17.75
12165 Item16 30 7.69
16541 Item12 21 9.99
21212 Itme31 19 8.35
41742 Item14 55 12.36
执行应该从Linux中的命令行以下列方式工作:
search 12382 prog5.idx
使用prog5.idx作为创建的索引文件。
我写了一些代码,但到目前为止它所做的只是打开数据文件。
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ifstream data;
data.open("prog5.dat");
ofstream outFile("prog5.idx", ios::out);
//if file can't be opened, exit
if(!data) {
cerr << "Open Failure" << endl;
exit(1);
}
else {
cout << "File is open" << endl;
}
}
一旦我弄清楚文件打开后该做什么,“文件已打开”部分将被替换,只是使用此消息来验证它是否正在打开文件。
我从来没有使用过这类文件,所以不知道从哪里开始。
答案 0 :(得分:1)
我将为您提供第一个程序的天真草案,以便您可以理解一般的想法:
#include <map>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
using namespace std;
struct Record
{
int key;
char name[8];
int code;
double cost;
size_t offset;
};
int main() {
std::map<int,Record> mymap;
ifstream data;
size_t offset_count = 0;
data.open("prog5.dat");
ofstream outFile("prog5.idx", ios::out);
//if file can't be opened, exit
if(!data) {
cerr << "Open Failure" << endl;
exit(1);
}
else {
cout << "File is open" << endl;
}
std::string line;
while (std::getline(data, line))
{
std::istringstream iss(line);
Record tmp;
if (!(iss >> tmp.key >> tmp.name >> tmp.code >> tmp.cost))
{
break; // error, do something
}
tmp.offset = offset_count;
offset_count += sizeof(Record);
mymap.insert( pair<int,Record>(tmp.key,tmp) );
}
// Now you have all the info (and much more) you need in memory,
// thus serialize the key and its position on a file
// So you have done the first part of the assignment
}
如果您不知道如何在std:map
内进行迭代,请查看示例here。