如何使用seekg与字符串输入从二进制文件中获取记录
How to use seekg with string input to get a record from a binary file
我的示例文本文件看起来像这样:
Name: First
Email: first@gmail.com
Name: Second
Email: second@gmail.com
目前我写了一个函数从指定的二进制文件中读取记录:
Staff getARecord (fstream& afile, const char fileName [], int k)
{
afile.open (fileName, ios::in | ios::binary);
Staff s;
afile.seekg ((k - 1) * sizeof (Staff), ios::beg);
afile.read (reinterpret_cast <char *>(&s), sizeof (s));
afile.close ();
return s;
}
Staff
是由name
和email
域组成的结构。然后我将根据用户输入获取记录:
int k;
cout << "Enter your email: ";
cin >> k;
Staff s = getARecord(afile,"staff.dat",k);
然后我已经成功读取数据,如果用户的输入是数字(1和2现在,因为我只有2条记录)为了seekg
功能,我怎么能检索相同的结果,如果用户输入电子邮件而不是记录号?
正如评论中提到的,有一个严重的问题是你将数据加载到Staff
结构中的方式:afile.seekg(...); afile.read(...);
行很奇怪:seekg
不应该像你期望的那样工作。由于您的文件是一个文本文件,您应该使用文本技术:操作符>>
或getline
方法。
如果你真的想直接从文件中加载Staff
项,你可以重载operator>>
:(这只是一个例子,它应该得到改进)
struct Staff{
string name, email;
};
istream& operator>>(istream& is, Staff& staff)
{
string s;
while(is >> s && s != "Name:"); // Look for "Name:"
staff.name = "";
while(is >> s && s != "Email:"){ // Look for "Email:"
staff.name += s + " "; // Load name (if multiple words)
}
staff.email = s; // Load email
// Handle errors
if(/* we couldn't load staff */)
is.setstate(std::ios::failbit);
return is;
}
然后,如果您想进行搜索,您别无选择,只能从头开始读取文件:
Staff staff;
// Search by id
for(int i=0 ; i<=k ; i++)
afile >> staff;
return staff;
// Search by email
while(afile >> staff){
if(staff.email == email)
return staff;
}
return /*Error*/;
相关文章:
- 如何从二进制文件中的给定符号中获取调用程序图
- 获取 JAR 文件中二进制文件的路径
- 如何从二进制文件中获取应用程序的版本号?
- 如何在没有.app的情况下,在 macOS 上使用 qmake 获取二进制文件
- 如何获取与 objdump 输出的标签相对应的 ELF 二进制文件中的文件偏移量
- 从C 中的二进制文件获取整数值时
- Android NDK 获取二进制文件的 md5
- 获取二进制文件的所有可能变体 - 给定一个模式
- 从二进制文件中获取源文件(和位置)的列表
- 获取二进制文件的最后 n 位
- PIN - 获取正在检测的二进制文件的进程 ID
- 从二进制文件读取结构数据时获取垃圾值
- 通过在 C++ 中使用发布模式二进制文件获取崩溃原因
- 如何使用eclipseC++获取二进制文件
- 获取二进制文件的数据和代码区域的大小
- 获取、修改二进制文件的信息
- 从二进制文件获取输入时发生访问冲突错误
- 获取静态二进制文件的AOSP回溯
- 如何在启动时从FastCGI c++二进制文件中获取环境变量
- 如何使用seekg与字符串输入从二进制文件中获取记录