使用tellg()和seekp()覆盖文件

时间:2018-12-25 18:47:11

标签: c++ file fstream

我试图以读写模式访问.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:

1 个答案:

答案 0 :(得分:0)

与其尝试就地更新文件,不如写出一个新文件然后在末尾重命名(删除旧文件之后),这要容易得多。

我将其保留在此处,如果您注意上述评论,我相信您可以解决。