当输出放到指定的文件行中时,会覆盖额外的文件行
Extra File lines being overwritten when output is put into specificied file lines
嘿,我有一个有点傻的问题,但我有一点问题与我的代码。我正试图覆盖文件的一行,这就是它所做的,但问题是它也覆盖了其他文件行。我使用的是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:改为只显示输出中应该显示的重要部分。
如果您查找文件中的某个点,然后开始在那里写入,那么您写入的内容将覆盖与您写入的内容完全相同的字节数-有点像编辑器总是处于覆盖模式而不是插入模式。
如果您希望您的结果仍然是一个简单的文本文件,您所能做的就是将数据复制到一个新文件中,将新数据插入到正确的位置,然后将原始文件中的剩余数据复制到插入新数据后的新文件中。
如果您希望该结果具有与原始文件相同的名称,您有几个选择—您可以将整个结果复制回现有文件,或者(如果您不担心多个硬链接到原始文件的可能性)您可以删除原始文件,并将新文件重命名为旧名称
相关文章:
- 使用ios:ate写入到流会覆盖现有文件
- 如何在 c++ 中覆盖相同的文本文件
- 每个文件(理想情况下是每个部分)的 clang 格式样式覆盖
- 在多个头文件中从接口声明被覆盖的函数时,如何避免重复代码?
- lnk1114无法覆盖原始文件"xxx.lib",错误代码32
- std :: ofstream,覆盖错误的文件行
- 覆盖现有的文本文件C
- 使用 std::cout 将"\r"写入文件会保存以前覆盖的行
- C++继承 - 覆盖功能,包括使用 "::" s、.h 文件和.cpp文件
- 如何在用户输入值后写入.csv文件的下一行,而不会覆盖以前的值?
- 需要在后代 .h 文件中重新声明被覆盖的函数
- 如何使用文件系统minifiter在网络共享驱动器上阻止文件覆盖
- 如何在标题文件中获取成员功能的正确代码覆盖范围
- C++删除或覆盖文件中的现有信息
- 覆盖生成文件中的宏常量
- 使用 tellg() 和 seekp() 覆盖文件
- C/C++ Linux 共享库能否通过将磁盘上自己的文件覆盖到较新版本来自动更新
- R Makevars 文件覆盖 R CMD 的默认 g++ 选项?
- 输出文件覆盖不正确
- 生成文件覆盖默认隐式规则