gpt4 book ai didi

c++ - 使用 system() 在 C++ 程序中读取行后删除行

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:46:48 25 4
gpt4 key购买 nike

我想了解在 C++ 或 C 中如何处理文件的基本 I/O。我的目标是逐行读取文件并将这些行发送到远程服务器。如果发送了该行,我想将其从文件中删除。
我尝试过的一种方法是,我对读取的行数进行计数,并调用 system() 系统调用来删除“count”行数。我使用了 bash 命令:sed -i -e 1,'count'd filename
之后我继续阅读该文件,令人惊讶的是它按计划工作。
我有两个问题:

  1. 这种方式可靠吗?
  2. 以及为什么这会起作用,什么时候阅读文件我删除了其中的一部分但它仍然有效?如果我找到了以前的位置,然后呢?

最好的,Digvijay

附言:
如果有人能提出更好的方法,我会很高兴。

这里还有我写的程序的代码:

#include<iostream>
#include<fstream>
#include<string>
#include<sstream>
#include<cstdlib>

int main(){
std::ifstream f;
std::string line;
std::stringstream ss;
int i=0;
f.open("in.txt");
if(f.is_open()){
while(getline(f,line)){
std::cout<<line<<std::endl;
i++;
if(i==2)break;
}
ss<<"sed -i -e 1,"<<i<<"d in.txt";
system(ss.str().c_str());
while(getline(f,line)){
std::cout<<line<<std::endl;
}
}
return 0;
}

编辑:首先感谢您抽出时间来写答案。但这里有一些我之前遗漏的额外信息。
我正在处理的文件是日志文件。因此,它们会不断地附加来自设备的信息。我想避免创建拷贝的原因是,日志文件本身非常大(有时),而且这有助于保持日志文件简短。因为它们会被分成几部分并存档在服务器上。
解决方案我找到了解决问题的方法。显然 Thomas 是对的,sed 确实创建了一个新文件。所以旧文件保持原样。使用它,我可以读取 n 行,调用系统函数,关闭文件指针并再次打开它。我在日志的小块上重复执行此操作,直到它变得很小并且因此可以有效处理。服务器同时将日志存档在 1gb 文件中。但是我有一个新问题,由于内存限制,我需要知道是否可以将日志文件有效地分成两个。 (这可能是关于 SO 的另一个问题)

最佳答案

大多数现代文件系统不支持删除文件开头的行,因此这样做效率很低。

实际问题的正常解决方案是在日志文件达到一定大小时停止写入日志文件,然后开始写入新文件。复制文件的代码可以在文件写入后删除整个文件(这是一种高效的操作)。

关于c++ - 使用 system() 在 C++ 程序中读取行后删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21058765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com