我正在逐字阅读以下文字文件,取代“@ name @”和“@ festival @”。我的程序适用于@ name @,但只改变了第一个@ festival @,而不是第二个。我不知道为什么。
John Doe
213-A室
通用旧建筑
信息技术学院
州立大学编程
纽约纽约12345-0987
USA
收件人:@name @
主题:季节的问候:@festival @
亲爱的@name @,
非常@节日@给你和你的家人!
您诚挚的,
约翰
td
答案 0 :(得分:1)
问题是内在的条件,如果在@ festival @之后存在' '
则不然。以下代码是正确的
void Main::readFile()
{
while (v.size() != 0) {
string name;
name = v.at(v.size()-1);
v.pop_back();
std::ofstream out(name + ".txt");
ifstream file;
file.open("letter.txt");
string word;
string comma;
char x;
word.clear();
while (!file.eof())
{
x = file.get();
while (x != ' ' && x != std::ifstream::traits_type::eof())
{
if (word == "@name@") {
word = name;
}
if (word == "@festival@") {
word = "THISISATEST!!!!!!!!!!!!!!";
}
word = word + x;
x = file.get();
}
if (word == "@name@") {
word = name;
}
if (word == "@festival@") {
word = "THISISATEST!!!!!!!!!!!!!!";
}
out << word + " ";
word.clear();
}
}
答案 1 :(得分:0)
首先,请参阅Why is iostream::eof inside a loop condition considered wrong?
这不是一个优雅的解决方案......但是对原始代码有了更好的改进。 (我会让你想到一个更有效的解决方案):
void Main::readFile()
{
while (v.size() != 0) {
string name;
name = v.at(v.size()-1);
v.pop_back();
std::ofstream out(name + ".txt");
ifstream file;
file.open("letter.txt");
string festival = "THISISATEST!!!";
string line, nameHolder = "@name@", festivalHolder = "@festival@";
while (std::getline(file, line))
{
std::size_t n_i = line.find(nameHolder);
if(n_i != std::string::npos)
line.replace(n_i, nameHolder.size(), name);
std::size_t f_i = line.find(festivalHolder);
if(f_i != std::string::npos)
line.replace(f_i, festivalHolder.size(), festival);
out << line << '\n';
}
}