优化代码 { fstream file; file.open("book.dat",ios::out|ios::binary); for(int i=0;i<=top;i++) if(book[i].getnote()==0) file.write((char*)&book[i],sizeof(book[i])); file.close(); }
时间: 2024-02-23 11:57:58 浏览: 56
可以通过以下几个方面来优化代码:
1. 将文件打开和关闭操作放在循环外部,可以减少文件操作的次数,提高效率。
2. 考虑使用更高效的文件操作方式,如使用流缓冲区等。
3. 考虑使用更高效的循环方式,如使用迭代器等。
根据以上几点,可以优化代码如下:
```
fstream file("book.dat", ios::out | ios::binary);
if (file.is_open()) {
for (auto it = begin(book); it != end(book); ++it) {
if (it->getnote() == 0) {
file.write(reinterpret_cast<const char*>(&(*it)), sizeof(*it));
}
}
file.close();
}
```
注意事项:
1. 使用 auto 关键字和迭代器,可以让代码更加简洁和高效。
2. 使用 reinterpret_cast 函数,可以将指针类型转换为 char* 类型,以满足 write 函数的参数要求。
相关问题
void modify(char name[50]){ fstream file; int flag = 0; file.open("Contacts.dat",ios::binary|ios::in|ios::out); Contacts obj; while(file.read((char*)&obj,sizeof(obj))){ if(strcmp(obj.getName(),name) == 0){ obj.print(); cout<<"请依次输入修改信息:"<<endl; obj = Set(obj); obj.print(); file.seekp(0); file.write((char*)&obj,sizeof(obj)); flag = 1; } } if(flag == 0){ cout<<"未查询到联系人信息"<<endl; }else{ cout<<"修改成功"<<endl; } file.close(); }添加注释
//定义一个名为modify的函数,参数为名字name
void modify(char name[50]) {
//创建一个名为file的文件流,打开"Contacts.dat"文件,并以二进制形式读写数据
fstream file;
//定义一个标记flag,用于记录是否找到要修改的联系人信息
int flag = 0;
file.open("Contacts.dat", ios::binary | ios::in | ios::out);
//创建一个名为obj的Contacts类对象
Contacts obj;
//循环读取文件中的数据,直到读到文件结尾
while (file.read((char*)&obj, sizeof(obj))) {
//如果找到了要修改的联系人信息
if (strcmp(obj.getName(), name) == 0) {
//调用print函数输出obj对象的信息
obj.print();
//输出提示信息,让用户输入修改后的联系人信息
cout << "请依次输入修改信息:" << endl;
//调用Set函数给obj对象赋新值
obj = Set(obj);
//调用print函数输出修改后的obj对象的信息
obj.print();
//将文件指针移动到当前位置
file.seekp(file.tellg() - sizeof(obj));
//将修改后的obj对象以二进制形式写入文件中
file.write((char*)&obj, sizeof(obj));
//将标记flag置为1,表示已经找到并修改了联系人信息
flag = 1;
}
}
//如果未找到要修改的联系人信息,则输出提示信息
if (flag == 0) {
cout << "未查询到联系人信息" << endl;
} else {
//否则输出修改成功信息
cout << "修改成功" << endl;
}
//关闭文件流
file.close();
}
#include<iostream> #include<fstream> using namespace std; class Student { public: int num; char name[20]; }; int main() { fstream iofile("File.txt", ios::in | ios::out | ios::binary); if (!iofile) { cout << "打开失败" << endl; exit(1); } Student st[2] = { {101 ,"Tom"},{102,"Bob"} }, stunew[2]; for (int i = 0; i < 2; i++) { iofile.write((char*)&st[i], sizeof(Student)); } for (int i = 0; i < 2; i++) { iofile.seekg(i * sizeof(st[i]), ios::beg); iofile.read((char*)&stunew[i], sizeof(Student)); } strcpy(stunew[1].name, "Lux"); stunew[1].num = 103; iofile.seekp(sizeof(st[0]), ios::beg); iofile.write((char*)&stunew[1], sizeof(Student)); iofile.seekg(0, ios::beg); for (int i = 0; i < 2; i++) { iofile.read((char*)&stunew[i], sizeof(Student)); cout << "第" << i + 1 << "个同学的信息:" << stunew[i].name << ":" << stunew[i].num << endl; } iofile.close(); }代码为什么运行错误
你的代码运行错误的原因是,你在写入文件时使用了 `ios::binary` 标志,但在读取文件时没有使用该标志。这会导致在 Windows 系统上读取二进制文件时出现问题。
为了解决这个问题,你需要在读取文件时也使用 `ios::binary` 标志,像这样:
```
iofile.seekg(i * sizeof(st[i]), ios::beg);
iofile.read((char*)&stunew[i], sizeof(Student));
```
修改后的完整代码如下:
```
#include<iostream>
#include<fstream>
using namespace std;
class Student {
public:
int num;
char name[20];
};
int main() {
fstream iofile("File.txt", ios::in | ios::out | ios::binary);
if (!iofile)
{
cout << "打开失败" << endl;
exit(1);
}
Student st[2] = { {101 ,"Tom"},{102,"Bob"} }, stunew[2];
for (int i = 0; i < 2; i++)
{
iofile.write((char*)&st[i], sizeof(Student));
}
for (int i = 0; i < 2; i++)
{
iofile.seekg(i * sizeof(st[i]), ios::beg);
iofile.read((char*)&stunew[i], sizeof(Student));
}
strcpy(stunew[1].name, "Lux");
stunew[1].num = 103;
iofile.seekp(sizeof(st[0]), ios::beg);
iofile.write((char*)&stunew[1], sizeof(Student));
iofile.seekg(0, ios::beg);
for (int i = 0; i < 2; i++)
{
iofile.read((char*)&stunew[i], sizeof(Student));
cout << "第" << i + 1 << "个同学的信息:" << stunew[i].name << ":" << stunew[i].num << endl;
}
iofile.close();
return 0;
}
```
阅读全文
相关推荐















