std :: ofstream,覆盖错误的文件行

时间:2018-04-01 15:03:35

标签: c++

我有一个将数据输出到文本文件的函数:

void File_IO::save( const std::string& path_ ) const
{

    const std::string file_name = path_ + this->local_time() + ".txt";
    std::ofstream outfile( file_name );

    std::vector<std::string> vec = { "One", "Two", "Three", "Four" };


    outfile << '\n' << '\n' << "//--------------------------------- DATA:" << '\n' << '\n';

    long pos_beg = outfile.tellp();

    for( auto& i : vec )
    {
        outfile << i << '\n';
    }

    long pos_end = outfile.tellp();

    outfile << '\n' << "//---------------------------------------" << '\n' << '\n';



    //outfile.seekp( 0 );   
    //outfile << pos_beg << " " << pos_end << " " << pos_beg << " " << pos_end;
}

输出:

//--------------------------------- DATA:

One
Two
Three
Four

//---------------------------------------

当涉及用数据的开始/结束位置覆盖第一行时,问题出现在函数的末尾...添加以下两行:

outfile.seekp( 0 ); 
outfile << pos_beg << " " << pos_end << " " << pos_beg << " " << pos_end;

输出:

49 72 49 72---------------------------- DATA:

One
Two
Three
Four

//---------------------------------------

正如你所看到的,在我们到达标题之前文件中有两个空行,而是覆盖它们并部分删除标题行,该标题行是文件中的第3行而不是预期的第1行。

另一条线索:

如果我只写一个var,它似乎工作但仍然删除文件开头的一个空行:

outfile.seekp( 0 ); 
outfile << pos_beg ;

输出:

49
//--------------------------------- DATA:

One
Two
Three
Four

//---------------------------------------

有人可以解释这里发生了什么,以及如何根据需要编辑我的功能?

PS 不允许我出于某种原因添加相关标签

1 个答案:

答案 0 :(得分:0)

在伊戈尔向右移动的方向后面,向函数添加以下代码行似乎有效:

outfile << "                                                     " << '\n';

修订功能:

void File_IO::save( const std::string& path_ ) const
{

    const std::string file_name = path_ + this->local_time() + ".txt";
    std::ofstream outfile( file_name );

    std::vector<std::string> vec = { "One", "Two", "Three", "Four" };

    // Edit
    outfile << "                                                     " << '\n';   
    // Edit

    outfile << '\n' << '\n' << "//--------------------------------- DATA:" << '\n' << '\n';

    long pos_beg = outfile.tellp();

    for( auto& i : vec )
    {
        outfile << i << '\n';
    }

    long pos_end = outfile.tellp();

    outfile << '\n' << "//---------------------------------------" << '\n' << '\n';



    outfile.seekp( 0 );   
    outfile << pos_beg << " " << pos_end << " " << pos_beg << " " << pos_end;
}

输出:

104 127 104 127                                      


//--------------------------------- DATA:

One
Two
Three
Four

//---------------------------------------

如果有人可以提供更好的答案并说出原因,那么我会接受一个看起来有点躲闪的人。