当输出放到指定的文件行中时,会覆盖额外的文件行

Extra File lines being overwritten when output is put into specificied file lines

本文关键字:文件 覆盖 输出      更新时间:2023-10-16

嘿,我有一个有点傻的问题,但我有一点问题与我的代码。我正试图覆盖文件的一行,这就是它所做的,但问题是它也覆盖了其他文件行。我使用的是c++ visual studio 2010。我的代码如下。

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
const string FILENAME = "DatabaseTest.txt";
fstream& GoToLineI(fstream& file, int num)
{
file.seekg(ios::beg);
for(int i = 0; i < num+1; i++)
    file.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
return file;
}
fstream& GoToLineO(fstream& file, int num)
{
file.seekp(ios::beg);
for( int i = 0; i < num; i++)
{
    //gets the length of the line.
    GoToLineI(file, i);
    string s;
    file >> s;
    long pos = file.tellp();
    file.seekp( pos + s.length() );
}
return file;
 }
int main()
{
fstream myfile(FILENAME.c_str(), ios::out);
myfile.close();
myfile.open(FILENAME.c_str(), ios::in | ios::out);
myfile << "Usernames:" << endl;
for( int j = 0; j < 101; j++)
    myfile << j << endl;
cout << "Where do you want to grab the data from?";
int i = 0;
cin >> i;
GoToLineI(myfile, i);
string line;
myfile >> line;
cout << line << endl;
GoToLineO(myfile, i);
if( myfile.is_open() )
{
    cout << "File should be writeable" << endl;
    myfile << "This should be at line 75" << endl;
}
myfile.seekp(ios::end);
system("PAUSE");
myfile.close();
return 0;
}

问题可能在于我如何拥有我的GoToLineO,这就是我如何找到输出行,并且它调用GoToLineI以获得行长度,直到它到达开始显示输出的正确行。这段代码生成的输出如下所示:

72
73
74
This should be at line 75
82
83
84

它应该是这样的:

73
74
This should be at line 75
76
77
78
79
80
81

任何形式的见解或建议将不胜感激。

edit:改为只显示输出中应该显示的重要部分。

如果您查找文件中的某个点,然后开始在那里写入,那么您写入的内容将覆盖与您写入的内容完全相同的字节数-有点像编辑器总是处于覆盖模式而不是插入模式。

如果您希望您的结果仍然是一个简单的文本文件,您所能做的就是将数据复制到一个新文件中,将新数据插入到正确的位置,然后将原始文件中的剩余数据复制到插入新数据后的新文件中。

如果您希望该结果具有与原始文件相同的名称,您有几个选择—您可以将整个结果复制回现有文件,或者(如果您不担心多个硬链接到原始文件的可能性)您可以删除原始文件,并将新文件重命名为旧名称