0

嘿,我有一个愚蠢的问题,但我的代码有点问题。我正在尝试覆盖文件的一行,这就是它的作用,但问题是它也覆盖了其他文件行。我正在使用 C++ Visual Studios 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

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

编辑:更改为仅应显示的输出的重要部分。

4

1 回答 1

0

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

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

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

于 2013-04-10T03:08:17.933 回答