编写一个带缓存的对文本文件进行读写操作的程序。 (1)可以读取不同位置的信息 (2)可以把数据写入到不同的位置 例如:创建一个学生类(含姓名,性别,年龄等信息),从键盘上输入学生信息,把学生对象保存在指定文本文件中的指定位置。从文本文件中读取特定学生信息。实现学生信息的增加、删除、修改、插入等操作。
时间: 2024-02-06 18:09:38 浏览: 17
以下是一个简单的带缓存的对文本文件进行读写操作的程序,以保存学生信息为例:
```python
import pickle
class Student:
def __init__(self, name, gender, age):
self.name = name
self.gender = gender
self.age = age
def __str__(self):
return f"{self.name}, {self.gender}, {self.age}"
class FileCache:
def __init__(self, file_path, block_size=4096):
self.file_path = file_path
self.block_size = block_size
self.cache = {} # 缓存字典,用于存储读取过的块
self.file = open(file_path, "ab+")
def __getitem__(self, index):
if index in self.cache:
return self.cache[index]
else:
self.file.seek(index * self.block_size)
data = self.file.read(self.block_size)
self.cache[index] = data
return data
def __setitem__(self, index, data):
self.cache[index] = data
self.file.seek(index * self.block_size)
self.file.write(data)
def __delitem__(self, index):
del self.cache[index]
self.file.truncate(index * self.block_size)
def __len__(self):
return (self.file.tell() + self.block_size - 1) // self.block_size
def close(self):
self.file.close()
def save_student_info(student, file_cache, index):
data = pickle.dumps(student)
file_cache[index] = data
def get_student_info(file_cache, index):
data = file_cache[index]
student = pickle.loads(data)
return student
def add_student_info(student, file_cache):
index = len(file_cache)
save_student_info(student, file_cache, index)
def delete_student_info(file_cache, index):
del file_cache[index]
def update_student_info(student, file_cache, index):
save_student_info(student, file_cache, index)
def insert_student_info(student, file_cache, index):
# 从最后一个数据块开始,逐个向后移动
for i in range(len(file_cache)-1, index-1, -1):
data = file_cache[i]
file_cache[i+1] = data
save_student_info(student, file_cache, index)
def main():
file_cache = FileCache("students.bin")
while True:
print("1. Add student info")
print("2. Get student info")
print("3. Delete student info")
print("4. Update student info")
print("5. Insert student info")
print("6. Exit")
choice = input("Enter your choice: ")
if choice == "1":
name = input("Enter student name: ")
gender = input("Enter student gender: ")
age = int(input("Enter student age: "))
student = Student(name, gender, age)
add_student_info(student, file_cache)
print("Student info saved.")
elif choice == "2":
index = int(input("Enter student index: "))
student = get_student_info(file_cache, index)
print(student)
elif choice == "3":
index = int(input("Enter student index: "))
delete_student_info(file_cache, index)
print("Student info deleted.")
elif choice == "4":
index = int(input("Enter student index: "))
name = input("Enter student name: ")
gender = input("Enter student gender: ")
age = int(input("Enter student age: "))
student = Student(name, gender, age)
update_student_info(student, file_cache, index)
print("Student info updated.")
elif choice == "5":
index = int(input("Enter insert index: "))
name = input("Enter student name: ")
gender = input("Enter student gender: ")
age = int(input("Enter student age: "))
student = Student(name, gender, age)
insert_student_info(student, file_cache, index)
print("Student info inserted.")
elif choice == "6":
file_cache.close()
break
else:
print("Invalid choice.")
if __name__ == "__main__":
main()
```
以上程序中,`FileCache` 类实现了对文件的读写缓存。文件被分为若干个数据块,每个数据块的大小由 `block_size` 参数指定。`cache` 属性是一个字典,用于存储已经读取过的数据块。`__getitem__` 和 `__setitem__` 方法实现了对缓存的读写,当需要读取一个数据块时,先从缓存字典中查找,如果没有再从文件中读取,并将读取的数据块存入缓存字典。`__delitem__` 方法实现了对缓存的删除操作。`__len__` 方法返回文件的数据块数。
程序中的其它函数都是对学生信息的增、删、改、查操作,使用了 `pickle` 模块实现了对象的序列化和反序列化。其中,`save_student_info` 函数将学生对象序列化后写入文件缓存,`get_student_info` 函数从文件缓存中读取指定位置的学生信息并反序列化,`add_student_info` 函数将一个新的学生信息追加到文件尾部,`delete_student_info` 函数删除指定位置的学生信息并将该位置之后的所有信息向前移动一个位置,`update_student_info` 函数更新指定位置的学生信息,`insert_student_info` 函数在指定位置插入一个新的学生信息,并将该位置之后的所有信息向后移动一个位置。
在主函数中,通过输入数字选择不同的操作,直到用户选择退出程序。