我认为这应该很简单,但到目前为止我的谷歌搜索没有帮助......我需要用C ++写一个现有的文件,但不一定要写在文件的末尾。
我知道当我只想将文本追加到我的文件中时,我可以在我的流对象上调用ios:app
时传递标记open
。但是,这只是让我写到文件的最后,而不是写到它的中间。
我做了一个简短的程序来说明这个问题:
#include <iostream>
#include <fstream>
using namespace std;
int main () {
string path = "../test.csv";
fstream file;
file.open(path); // ios::in and ios::out by default
const int rows = 100;
for (int i = 0; i < rows; i++) {
file << i << "\n";
}
string line;
while (getline(file, line)) {
cout << "line: " << line << endl; // here I would like to append more text to certain rows
}
file.close();
}
答案 0 :(得分:12)
您无法在文件中间插入。您必须将旧文件复制到新文件,并在复制到新文件期间插入中间的任何内容。
否则,如果您打算覆盖现有文件中的数据/行,可以使用std::ostream::seekp()
来识别文件中的位置。
答案 1 :(得分:1)
您可以写到最后并交换行,直到其结束在正确的位置。 这就是我要做的。 这是之前的test.txt文件:
12345678
12345678
12345678
12345678
12345678
这是我的程序的示例
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
fstream& goToLine(fstream& file, int line){
int charInLine = 10; //number of characters in each line + 2
//this file has 8 characters per line
int pos = (line-1)*charInLine;
file.seekg(pos);
file.seekp(pos);
return file;
}
fstream& swapLines(fstream& file, int firstLine, int secondLine){
string firstStr, secondStr;
goToLine(file,firstLine);
getline(file,firstStr);
goToLine(file,secondLine);
getline(file,secondStr);
goToLine(file,firstLine);
file.write(secondStr.c_str(),8); //Make sure there are 8 chars per line
goToLine(file,secondLine);
file.write(firstStr.c_str(),8);
return file;
}
int main(){
fstream file;
int numLines = 5; //number of lines in the file
//open file once to write to the end
file.open("test.txt",ios::app);
if(file.is_open()){
file<<"someText\n"; //Write your line to the end of the file.
file.close();
}
//open file again without the ios::app flag
file.open("test.txt");
if(file.is_open()){
for(int i=numLines+1;i>3;i--){ //Move someText\n to line 3
swapLines(file,i-1,i);
}
file.close();
}
return 0;
}
以下是test.txt文件:
12345678
12345678
someText
12345678
12345678
12345678
我希望这会有所帮助!
答案 2 :(得分:1)
基于我对操作系统的基本知识,我会说这是不可能的。 我的意思是说,要使操作系统能够使用当前的存储技术实现这种功能并非并非不可能,但是这样做总是会浪费分段的空间。
但是我不知道有什么技术可以做到这一点。尽管某些基于云的数据库确实使用了这类功能(例如在文件中间插入内容),但是它们是专门针对该DBMS软件制作的,具有非常针对性的硬件,并且它们可能还具有一些自定义的内核执行此类任务。