我试图以读写模式访问.txt文件,然后覆盖文本的特定部分。
.txt文件存储一个用户列表,每个用户的标识如下:
mysql> create table foo ( id serial primary key );
mysql> create table bar (foo_id bigint unsigned not null,
foreign key (foo_id) references foo(id));
mysql> insert into foo values (1);
mysql> insert into bar values (1);
mysql> delete foo.*, bar.* from foo join bar on foo.id=bar.foo_id where foo.id=1;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint
fails (`test`.`bar`, CONSTRAINT `bar_ibfk_1` FOREIGN KEY (`foo_id`) REFERENCES
`foo` (`id`))
负责进行更改的方法的任务是解析文件并修改电子邮件阵营。
它输入一个User对象和必须注册的新电子邮件。
UserType:FirstName:LastName:Email:Password:endl:
运行该方法后,不作任何更改将应用于users.txt文件。 字符串“ remaining_data”确实可以在电子邮件发送后正确注册字符串。
删除使用剩下的数据字符串的那部分代码确实会修改文件,但是显然不是按照我想要的方式进行
void userContainer::modifyEmail(User & u, string newmail){
fstream user_file;
string temp;
user_file.open("users.txt");
while(!(user_file.eof())){
getline(user_file,temp,':');
if(temp==u.getEmail()){
//save position of the email string
long pos=user_file.tellg();
//copy user data following the email
string remaining_data;
getline(user_file,remaining_data,'\n');
//overwrite with newmail
user_file.seekp(pos-(temp.size()+1));//positioning the pos value at the beginning of the email camp
user_file.write(&newmail[0],newmail.size()); //overwriting with the new mail
//writing remaining data;
user_file.write(&remaining_data[0], remaining_data.size());
}
}
user_file.close();
}
示例:
在调用ModifyEmail之前:
void userContainer::modifyEmail(User & u, string newmail){
fstream user_file;
string temp;
user_file.open("users.txt");
while(!(user_file.eof())){
getline(user_file,temp,':');
if(temp==u.getEmail()){
//save position of the email string
long pos=user_file.tellg();
//overwrite with newmail
user_file.seekp(pos-(temp.size()+1));
user_file.write(&newmail[0],newmail.size());
}
}
user_file.close();
}
调用modifyEmail之后(不使用剩余数据)
admin:Cristiano:Ronaldo:cr7@fluffymail.com:cri7madr1d:endl:
调用方法后的必需行为
admin:Cristiano:Ronaldo:banana100000@hotmail.itmadr1d:endl:
答案 0 :(得分:0)
与其尝试就地更新文件,不如写出一个新文件然后在末尾重命名(删除旧文件之后),这要容易得多。
我将其保留在此处,如果您注意上述评论,我相信您可以解决。