我正在寻找一些建议。
我的情况:
我目前的理论方法:
C++ 中是否有一些简化方法(使用迭代器?)仅标准系统库 (unix).
谢谢你的想法。
这是一个可能的解决方案,使用:
- std::getline() http://en.cppreference.com/w/cpp/string/basic_string/getline
- std::copy() http://en.cppreference.com/w/cpp/algorithm/copy
- istream_iterator http://en.cppreference.com/w/cpp/iterator/istream_iterator
- ostream_iterator http://en.cppreference.com/w/cpp/iterator/ostream_iterator
- vector http://en.cppreference.com/w/cpp/container/vector
Example:
#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;
}
我不确定线条的具体操作应该是什么,但您可以使用:
-
std::string::find() http://en.cppreference.com/w/cpp/string/basic_string/find and std::string::substr() http://en.cppreference.com/w/cpp/string/basic_string/substr
- boost::split() http://www.boost.org/doc/libs/1_49_0/doc/html/boost/algorithm/split_id820181.html
EDIT:
为了避免将初始的每一行一次存储在内存中copy()
可以更改为写入替代文件,后跟一个文件rename() http://en.cppreference.com/w/cpp/io/c/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.
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)