我正在寻找一些建议。
我的情况:
应用程序适用于文本本地文件。
在文件中的某处是这样的标签:
correct = "TEXT"。不幸的是,正确的, = 和“TEXT”之间可以有无限的空格。
获取的文本正在测试中,可能会被替换(更改必须存储在文件中)。
correct = "CORRECT_TEXT"
我目前的理论方法:
ofstream - 逐行读取字符串。
查找标记并在字符串中进行更改。
将字符串保存为文件的行。
C ++中是否有一些简化方法(使用迭代器?),仅使用标准系统库(unix)。
感谢您的想法。
答案 0 :(得分:4)
这是一个可能的解决方案,使用:
示例:
#include <iostream>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <string>
#include <vector>
struct modified_line
{
std::string value;
operator std::string() const { return value; }
};
std::istream& operator>>(std::istream& a_in, modified_line& a_line)
{
std::string local_line;
if (std::getline(a_in, local_line))
{
// Modify 'local_line' if necessary
// and then assign to argument.
//
a_line.value = local_line;
}
return a_in;
}
int main()
{
std::ifstream in("file.txt");
if (in.is_open())
{
// Load into a vector, modifying as they are read.
//
std::vector<std::string> modified_lines;
std::copy(std::istream_iterator<modified_line>(in),
std::istream_iterator<modified_line>(),
std::back_inserter(modified_lines));
in.close();
// Overwrite.
std::ofstream out("file.txt");
if (out.is_open())
{
std::copy(modified_lines.begin(),
modified_lines.end(),
std::ostream_iterator<std::string>(out, "\n"));
}
}
return 0;
}
我不确定线条的操作应该是什么,但你可以使用:
编辑:
为避免一次将每一行存储在内存中,初始copy()
可以更改为写入备用文件,然后是文件rename()
:
std::ifstream in("file.txt");
std::ofstream out("file.txt.tmp");
if (in.is_open() && out.open())
{
std::copy(std::istream_iterator<modified_line>(in),
std::istream_iterator<modified_line>(),
std::ostream_iterator<std::string>(out, "\n"));
// close for rename.
in.close();
out.close();
// #include <cstdio>
if (0 != std::rename("file.txt.tmp", "file.txt"))
{
// Handle failure.
}
}
答案 1 :(得分:1)
您可以将任务拆分成小块,并弄清楚如何在C ++中执行每个任务:
注意:在这种情况下,您不需要一次在内存中存储多行。
答案 2 :(得分:1)
它看起来很像'INI文件'语法。你可以搜索它,你会有很多例子。但是,实际上很少使用C ++ stdlib。
这是一些建议。 (n.b.我假设您需要替换的每一行都使用以下语法:<parameter> = "<value_text>"
)
std::string::find
方法找到'='字符。std::string::substr
方法将字符串拆分为不同的块。通过所有这些,您将能够拆分字符串并隔离部件以进行比较,并进行必要的修改。
玩得开心!
答案 3 :(得分:0)
您确定需要在C ++中执行此操作吗?由于您使用的是Unix,因此可以使用以下命令调用sed
,这样可以轻松完成:
cat oldfile | sed 's/\(correct *= *\)\"TEXT\"/\1\"CORRECT_TEXT\"/' > newfile
如果必须,可以在C ++中调用unix命令(例如system("command")
中的<cstdlib>
。